테이블에 숫자형 데이터와 숫자형이 아닌 데이터가 모두 있는 경우의 계산
이 예제에서는 테이블에 숫자형 데이터와 숫자형이 아닌 데이터가 모두 있는 경우 테이블의 데이터에 대해 계산을 수행하는 방법을 보여줍니다. 숫자형 데이터가 포함된 테이블 변수를 식별한 후, 중괄호 또는 점 표기법을 사용하여 이러한 변수에 저장된 데이터에 액세스할 수 있습니다. 그런 다음, 숫자형 데이터에 대해 산술 연산을 수행하거나 함수를 호출하고 그 결과를 다시 테이블에 할당할 수 있습니다. 이 모든 것을 코드 한 줄로 할 수 있습니다. 또한, 테이블 행에 대해 계산을 수행하려면 rowfun
함수를, 변수에 대해 계산을 수행하려면 varfun
함수를 사용할 수 있습니다. 테이블에 데이터 그룹이 있는 경우 groupsummary
, rowfun
, varfun
함수를 사용하여 테이블의 각 그룹에 대해 계산을 수행하면 됩니다.
샘플 데이터를 테이블로 읽어오기
readtable
함수를 사용하여 CSV(쉼표로 구분된 값) 파일인 testScores.csv
의 데이터를 테이블로 읽어올 수 있습니다. 샘플 파일에는 두 학교에 다니는 학생 10명의 테스트 점수가 포함되어 있습니다. 출력 테이블에는 숫자형 데이터를 가지는 변수와 텍스트 데이터를 가지는 다른 변수가 포함됩니다. 이러한 변수 중 하나인 School
에는 고정된 값 집합 또는 범주 집합이 있습니다. 이러한 범주는 이 테이블 내에 있는 두 개의 학생 그룹을 나타냅니다. School
을 categorical
형 변수로 변환합니다.
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
의 출력값은 TestMin
과 TestMax
변수를 포함하는 새 테이블입니다. 또한, 이 경우에는 각 행의 값들이 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
scores
와 minmaxTest
를 결합하여 해당 값들을 하나의 테이블에 포함시킵니다.
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
전체 테이블 내의 데이터 그룹을 사용하여 계산하기
테이블에 하나 이상의 그룹화 변수가 있다면 테이블 내의 데이터 그룹에 대해 계산을 수행할 수 있습니다. 그룹화 변수의 값을 사용하여 행이 속한 그룹을 지정할 수 있습니다.
예를 들어, scores
의 School
변수에는 ABC School
과 XYZ 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
참고 항목
table
| rowfun
| varfun
| groupsummary
| readtable
| vartype