Main Content

테이블에 숫자형 데이터와 숫자형이 아닌 데이터가 모두 있는 경우의 계산

이 예제에서는 테이블에 숫자형 데이터와 숫자형이 아닌 데이터가 모두 있는 경우 테이블의 데이터에 대해 계산을 수행하는 방법을 보여줍니다. 숫자형 데이터가 포함된 테이블 변수를 식별한 후, 중괄호 또는 점 표기법을 사용하여 이러한 변수에 저장된 데이터에 액세스할 수 있습니다. 그런 다음, 숫자형 데이터에 대해 산술 연산을 수행하거나 함수를 호출하고 그 결과를 다시 테이블에 할당할 수 있습니다. 이 모든 것을 코드 한 줄로 할 수 있습니다. 또한, 테이블 행에 대해 계산을 수행하려면 rowfun 함수를, 변수에 대해 계산을 수행하려면 varfun 함수를 사용할 수 있습니다. 테이블에 데이터 그룹이 있는 경우 groupsummary, rowfun, varfun 함수를 사용하여 테이블의 각 그룹에 대해 계산을 수행하면 됩니다.

샘플 데이터를 테이블로 읽어오기

readtable 함수를 사용하여 CSV(쉼표로 구분된 값) 파일인 testScores.csv의 데이터를 테이블로 읽어올 수 있습니다. 샘플 파일에는 두 학교에 다니는 학생 10명의 테스트 점수가 포함되어 있습니다. 출력 테이블에는 숫자형 데이터를 가지는 변수와 텍스트 데이터를 가지는 다른 변수가 포함됩니다. 이러한 변수 중 하나인 School에는 고정된 값 집합 또는 범주 집합이 있습니다. 이러한 범주는 이 테이블 내에 있는 두 개의 학생 그룹을 나타냅니다. Schoolcategorical형 변수로 변환합니다.

scores = readtable("testScores.csv","TextType","string");
scores.School = categorical(scores.School)
scores=10×5 table
     LastName       School      Test1    Test2    Test3
    __________    __________    _____    _____    _____

    "Jeong"       XYZ School     90       87       93  
    "Collins"     XYZ School     87       85       83  
    "Torres"      XYZ School     86       85       88  
    "Phillips"    ABC School     75       80       72  
    "Ling"        ABC School     89       86       87  
    "Ramirez"     ABC School     96       92       98  
    "Lee"         XYZ School     78       75       77  
    "Walker"      ABC School     91       94       92  
    "Garcia"      ABC School     86       83       85  
    "Chang"       XYZ School     79       76       82  

숫자형 데이터가 포함된 하위 테이블 생성하기

숫자형 데이터로 작업하는 한 가지 간단한 방법은 숫자형 변수만 포함된 하위 테이블을 생성하는 것입니다. 괄호를 사용해서 행과 변수를 지정하여 테이블의 요소를 참조하는 방법으로 하위 테이블을 생성할 수 있습니다. 하위 테이블은 원래 테이블에서 지정된 행과 변수만 포함하는 더 작은 새 테이블입니다.

예를 들어, scores에서 테스트 점수만 포함된 하위 테이블을 생성해 보겠습니다. 처음 두 변수가 숫자형이 아닌 데이터를 가지므로 이 테이블에서 나머지 변수를 지정하는 요소를 참조할 수 있습니다.

numericScores = scores(:,3:end)
numericScores=10×3 table
    Test1    Test2    Test3
    _____    _____    _____

     90       87       93  
     87       85       83  
     86       85       88  
     75       80       72  
     89       86       87  
     96       92       98  
     78       75       77  
     91       94       92  
     86       83       85  
     79       76       82  

변수를 지정하는 또 다른 방법은 vartype 함수를 사용하여 데이터형으로 지정하는 것입니다. 이 함수는 각기 다른 데이터형의 변수가 다수 포함된 큰 테이블을 사용할 때 유용합니다. 이 함수는 테이블 변수를 지정하는 데 사용할 수 있는 첨자를 반환합니다.

numericVars = vartype("numeric")
numericVars = 
	table vartype subscript:

		Select table variables matching the type 'numeric'

numericScores = scores(:,numericVars)
numericScores=10×3 table
    Test1    Test2    Test3
    _____    _____    _____

     90       87       93  
     87       85       83  
     86       85       88  
     75       80       72  
     89       86       87  
     96       92       98  
     78       75       77  
     91       94       92  
     86       83       85  
     79       76       82  

하위 테이블에 숫자형 데이터만 있는 경우 계산하기

(R2023a 이상) 테이블의 모든 변수가 연산을 지원하는 데이터형을 가지는 경우 테이블에 대해 직접 연산을 수행할 수 있습니다. 자세한 내용은 Direct Calculations on Tables and Timetables 항목을 참조하십시오.

예를 들어, 테스트 점수가 25점 스케일을 사용하도록 숫자형 데이터를 스케일링합니다.

numericScores = numericScores .* 0.25
numericScores=10×3 table
    Test1    Test2    Test3
    _____    _____    _____

     22.5    21.75    23.25
    21.75    21.25    20.75
     21.5    21.25       22
    18.75       20       18
    22.25     21.5    21.75
       24       23     24.5
     19.5    18.75    19.25
    22.75     23.5       23
     21.5    20.75    21.25
    19.75       19     20.5

R2023a 이전의 릴리스에서는 이 구문을 사용할 수 없습니다. 대신 중괄호를 사용하여 테이블의 요소를 참조하거나 Variables를 사용하여 모든 테이블 행과 변수를 지정하십시오. 다음 구문은 앞의 연산과 동일한 결과를 반환하며 모든 릴리스에서 작동합니다.

numericScores{:,:} = numericScores{:,:} .* 0.25
numericScores.Variables = numericScores.Variables .* 0.25

이러한 구문을 사용하면 테이블 내용을 추출하여 배열로 결합하고 계산을 수행한 다음 결과를 다시 테이블에 할당합니다. 유일한 요구 사항은 변수가 모두 변수 결합이 허용되는 데이터형을 가져야 한다는 것입니다.

  • 중괄호를 사용하면 numericScores{1:5,["Test1","Test3"]}에서와 같이 행과 변수의 서브셋을 지정할 수도 있습니다.

  • Variables를 사용하면 항상 모든 행과 변수가 하나의 배열로 결합된 결과를 얻게 됩니다.

(R2023a 이상) 많은 수학 함수와 통계 함수를 테이블에 대해 직접 호출할 수도 있습니다. 예를 들어, 각 테이블 변수에서 해당 변수 내 최솟값을 빼보겠습니다.

numericScores = numericScores - min(numericScores)
numericScores=10×3 table
    Test1    Test2    Test3
    _____    _____    _____

    3.75        3     5.25 
       3      2.5     2.75 
    2.75      2.5        4 
       0     1.25        0 
     3.5     2.75     3.75 
    5.25     4.25      6.5 
    0.75        0     1.25 
       4     4.75        5 
    2.75        2     3.25 
       1     0.25      2.5 

마찬가지로 이 구문은 R2023a 이전의 릴리스에서는 사용할 수 없습니다. 대신 다음 구문 중 하나를 사용하십시오. 다음 구문은 동일한 결과를 반환하며 모든 릴리스에서 작동합니다.

numericScores{:,:} = numericScores{:,:} - min(numericScores{:,:})
numericScores.Variables = numericScores.Variables - min(numericScores.Variables)

임의의 테이블에서 하나의 변수에 대해 계산하기

모든 릴리스에서 점 표기법과 변수 이름을 사용하여 한 번에 한 변수에 대한 계산을 수행할 수도 있습니다. 예를 들어, Test3에 들어 있는 마지막 점수 세트에 5점을 더하여 점수를 고쳐 보겠습니다.

개별 변수에 대한 연산은 다른 테이블 변수에 영향을 미치지 않으므로 모든 테이블에서 이러한 종류의 계산을 수행할 수 있습니다. 다른 변수에 숫자형 데이터 또는 숫자형이 아닌 데이터가 있는지 여부는 중요하지 않습니다.

numericScores.Test3 = numericScores.Test3 + 5
numericScores=10×3 table
    Test1    Test2    Test3
    _____    _____    _____

    3.75        3     10.25
       3      2.5      7.75
    2.75      2.5         9
       0     1.25         5
     3.5     2.75      8.75
    5.25     4.25      11.5
    0.75        0      6.25
       4     4.75        10
    2.75        2      8.25
       1     0.25       7.5

전체 테이블에서 행별로 계산하기

전체 테이블 scores에는 숫자형 변수와 숫자형이 아닌 변수가 있습니다. 모든 릴리스에서 중괄호 인덱싱 또는 점 표기법을 사용하여 테이블 내의 지정된 행과 변수에 대해 계산을 수행합니다.

예를 들어, 학생별로 테스트 점수의 평균값, 최솟값, 최댓값을 구해 보겠습니다. 각 행에서 이러한 값을 계산합니다. 계산한 값을 scores에 새 테이블 변수로 할당합니다.

한 가지 간단하면서도 유용한 방법은 데이터를 행렬로 추출하여 그 행렬에 대해 함수를 호출한 다음 출력값을 새 테이블 변수로 할당하는 것입니다. 예를 들어, 각 행의 평균 테스트 점수를 계산합니다. 그런 다음, 계산된 값을 TestMean이라는 새 테이블 변수의 scores에 추가합니다. 중괄호를 사용하여 Test1, Test2, Test3에서 숫자형 데이터를 행렬로 추출합니다. 행별로 평균값을 계산하기 위해 mean을 호출할 때 차원을 2로 지정합니다.

vars = ["Test1","Test2","Test3"];
scores.TestMean = mean(scores{:,vars},2)
scores=10×6 table
     LastName       School      Test1    Test2    Test3    TestMean
    __________    __________    _____    _____    _____    ________

    "Jeong"       XYZ School     90       87       93           90 
    "Collins"     XYZ School     87       85       83           85 
    "Torres"      XYZ School     86       85       88       86.333 
    "Phillips"    ABC School     75       80       72       75.667 
    "Ling"        ABC School     89       86       87       87.333 
    "Ramirez"     ABC School     96       92       98       95.333 
    "Lee"         XYZ School     78       75       77       76.667 
    "Walker"      ABC School     91       94       92       92.333 
    "Garcia"      ABC School     86       83       85       84.667 
    "Chang"       XYZ School     79       76       82           79 

행별로 계산을 수행하는 또 다른 방법은 rowfun 함수를 사용하는 것입니다. rowfun을 사용할 때는 테이블에서 데이터를 추출할 필요가 없습니다. 대신, 테이블과 이 테이블의 데이터에 적용할 함수를 rowfun의 입력 인수로 전달합니다. 구문이 약간 더 복잡하지만, rowfun은 적용하는 함수가 여러 개의 입력 인수를 갖거나 여러 개의 출력 인수를 반환할 때 유용합니다.

예를 들어, bounds 함수를 사용하여 테스트 점수의 최솟값과 최댓값을 구해 보겠습니다. bounds 함수는 두 개의 출력 인수를 반환하므로, rowfun을 사용하여 이 함수를 scores에 적용합니다. rowfun의 출력값은 TestMinTestMax 변수를 포함하는 새 테이블입니다. 또한, 이 경우에는 각 행의 값들이 bounds로 전달되기 전에 벡터로 결합되도록 "SeparateInputs"false로 지정합니다.

minmaxTest = rowfun(@bounds, ...
                    scores, ...
                    "InputVariables",vars, ...
                    "OutputVariableNames",["TestMin","TestMax"], ...
                    "SeparateInputs",false)
minmaxTest=10×2 table
    TestMin    TestMax
    _______    _______

      87         93   
      83         87   
      85         88   
      72         80   
      86         89   
      92         98   
      75         78   
      91         94   
      83         86   
      76         82   

scoresminmaxTest를 결합하여 해당 값들을 하나의 테이블에 포함시킵니다.

scores = [scores minmaxTest]
scores=10×8 table
     LastName       School      Test1    Test2    Test3    TestMean    TestMin    TestMax
    __________    __________    _____    _____    _____    ________    _______    _______

    "Jeong"       XYZ School     90       87       93           90       87         93   
    "Collins"     XYZ School     87       85       83           85       83         87   
    "Torres"      XYZ School     86       85       88       86.333       85         88   
    "Phillips"    ABC School     75       80       72       75.667       72         80   
    "Ling"        ABC School     89       86       87       87.333       86         89   
    "Ramirez"     ABC School     96       92       98       95.333       92         98   
    "Lee"         XYZ School     78       75       77       76.667       75         78   
    "Walker"      ABC School     91       94       92       92.333       91         94   
    "Garcia"      ABC School     86       83       85       84.667       83         86   
    "Chang"       XYZ School     79       76       82           79       76         82   

전체 테이블에서 지정된 변수별로 계산하기

각 테스트의 평균 점수를 구해 보겠습니다. 해당 값을 테이블 변수별로 계산합니다.

가장 간단한 방법은 mean을 사용하는 것입니다. 먼저 중괄호를 사용하여 Test1, Test2, Test3에서 숫자형 데이터를 행렬로 추출합니다. 그런 다음, mean을 호출하여 행렬 각 열의 평균값을 계산합니다. 출력값은 숫자형 벡터이며, 여기서 각 요소는 테이블 변수의 평균입니다.

vars = ["Test1","Test2","Test3"];
meanOfEachTest = mean(scores{:,vars})
meanOfEachTest = 1×3

   85.7000   84.3000   85.7000

테이블 변수별로 계산을 수행하는 또 다른 방법은 varfun 함수를 사용하는 것입니다. varfun을 사용할 때는 테이블에서 데이터를 추출할 필요가 없습니다. 대신, 테이블과 이 테이블의 데이터에 적용할 함수를 varfun의 입력 인수로 전달합니다.

varfun을 사용하여 평균 점수를 계산합니다. 출력값은 새 테이블이며 테이블 변수와 관련된 의미있는 이름을 갖습니다.

meanOfEachTest = varfun(@mean, ...
                        scores, ...
                        "InputVariables",vars)
meanOfEachTest=1×3 table
    mean_Test1    mean_Test2    mean_Test3
    __________    __________    __________

       85.7          84.3          85.7   

전체 테이블 내의 데이터 그룹을 사용하여 계산하기

테이블에 하나 이상의 그룹화 변수가 있다면 테이블 내의 데이터 그룹에 대해 계산을 수행할 수 있습니다. 그룹화 변수의 값을 사용하여 행이 속한 그룹을 지정할 수 있습니다.

예를 들어, scoresSchool 변수에는 ABC SchoolXYZ School 두 개의 값이 있습니다. 이 두 값을 scores 내 데이터 그룹을 나타내는 범주로 볼 수 있습니다. 이 경우, 학교별로 계산을 수행할 수 있습니다.

함수를 적용하고 그룹화 변수를 사용하려면 varfun 함수를 사용하면 됩니다. mean과 같은 함수를 지정한 다음 varfun을 사용하여 이 함수를 지정된 각 테이블 변수에 적용할 수 있습니다. 그룹화 변수도 지정한 경우 varfun은 함수를 각 테이블 변수 내의 각 그룹에 적용합니다.

학교별로 각 테스트의 평균 점수를 계산합니다.

vars = ["Test1","Test2","Test3"];
meanScoresBySchool = varfun(@mean, ...
                            scores, ...
                            "InputVariables",vars, ...
                            "GroupingVariables","School")
meanScoresBySchool=2×5 table
      School      GroupCount    mean_Test1    mean_Test2    mean_Test3
    __________    __________    __________    __________    __________

    ABC School        5            87.4            87          86.8   
    XYZ School        5              84          81.6          84.6   

R2018a부터는 groupsummary 함수를 사용하여 각 테이블 변수의 데이터 그룹에 대한 계산을 수행할 수 있습니다.

meanScoresBySchool = groupsummary(scores,"School","mean",vars)
meanScoresBySchool=2×5 table
      School      GroupCount    mean_Test1    mean_Test2    mean_Test3
    __________    __________    __________    __________    __________

    ABC School        5            87.4            87          86.8   
    XYZ School        5              84          81.6          84.6   

groupsummary에 대한 구문은 더 간단합니다. 또한, groupsummary를 사용하여 한 번에 여러 메서드를 지정할 수도 있습니다. 예를 들어, 학교별로 각 테스트의 최소 점수와 최대 점수를 모두 구해 보겠습니다.

minmaxBySchool = groupsummary(scores,"School",["min","max"],vars)
minmaxBySchool=2×8 table
      School      GroupCount    min_Test1    max_Test1    min_Test2    max_Test2    min_Test3    max_Test3
    __________    __________    _________    _________    _________    _________    _________    _________

    ABC School        5            75           96           80           94           72           98    
    XYZ School        5            78           90           75           87           77           93    

groupsummary의 미리 정의된 메서드를 모두 사용하려면 메서드로 "all"을 지정하십시오. 학교별로 평균 테스트 점수에 대한 모든 통계량을 계산합니다.

allStatsBySchool = groupsummary(scores,"School","all","TestMean")
allStatsBySchool=2×14 table
      School      GroupCount    mean_TestMean    sum_TestMean    min_TestMean    max_TestMean    range_TestMean    median_TestMean    mode_TestMean    var_TestMean    std_TestMean    nummissing_TestMean    nnz_TestMean    numunique_TestMean
    __________    __________    _____________    ____________    ____________    ____________    ______________    _______________    _____________    ____________    ____________    ___________________    ____________    __________________

    ABC School        5            87.067           435.33          75.667          95.333           19.667            87.333            75.667           57.967          7.6136                0                  5                  5         
    XYZ School        5              83.4              417          76.667              90           13.333                85            76.667           29.856           5.464                0                  5                  5         

하나의 테이블 변수에서 특정 값을 찾은 다음 다른 테이블 변수에서 그에 대응하는 값을 찾으려고 할 수도 있습니다. 이런 경우에는 rowfun을 사용하십시오.

예를 들어, 각 학교에서 평균 테스트 점수가 가장 높은 학생을 찾아보겠습니다. 이 예제에 첨부된 지원 함수 findNameAtMax는 최고 점수와 해당 점수를 획득한 학생의 이름을 모두 반환합니다. rowfun을 사용하여 각 학생 그룹에 findNameAtMax를 적용합니다. findNameAtMax는 여러 개의 입력 인수(학생의 이름과 테스트 점수)를 갖고 여러 개의 출력 인수를 반환하므로 rowfun 함수가 적합합니다.

maxScoresBySchool = rowfun(@findNameAtMax, ...
                           scores, ...
                           "InputVariables",["LastName","TestMean"], ...
                           "GroupingVariables","School", ...
                           "OutputVariableNames",["max_TestMean","LastName"])
maxScoresBySchool=2×4 table
      School      GroupCount    max_TestMean    LastName 
    __________    __________    ____________    _________

    ABC School        5            95.333       "Ramirez"
    XYZ School        5                90       "Jeong"  

지원 함수

function [maxValue,lastName] = findNameAtMax(names,values)
    % Return maximum value and the last name 
    % from the row at which the maximum value occurred
    [maxValue,maxIndex] = max(values);
    lastName = names(maxIndex);
end

참고 항목

| | | | |

관련 항목