table に数値データと非数値データの両方が含まれている場合の計算
この例では、数値データと非数値データの両方が含まれている場合に table 内のデータで計算を行う方法を示します。数値データを含む table 変数を特定したら、中かっこまたはドット表記を使用してこれらの変数内のデータにアクセスできます。その後、数値データに対して算術演算を実行したり関数を呼び出したりして、結果を table に代入し直すことができ、そのすべてを 1 行のコードで実行できます。また、関数 rowfun
を使用して table の各行で計算を行うことや、関数 varfun
を使用して変数に沿って計算を行うこともできます。table 内にデータ グループがある場合は、関数 groupsummary
、rowfun
、および varfun
を使用して、table 内のグループごとに計算を実行できます。
table へのサンプル データの読み込み
関数 readtable
を使用して、CSV (コンマ区切り値) ファイル testScores.csv
から table へデータを読み取ります。このサンプル ファイルには、2 つの異なる学校に通う生徒 10 人のテストの得点が含まれています。出力 table には、数値データをもつ変数とテキスト データをもつ他の変数が含まれます。これらの変数の 1 つ School
は、固定されたセットの値、つまりカテゴリをもっています。これらのカテゴリは、この table 内の 2 つの生徒グループを表します。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
数値データをもつサブテーブルの作成
数値データを操作する単純な方法の 1 つは、数値変数のみをもつサブテーブルを作成することです。サブテーブルを作成するには、小かっこを使用して行および変数を指定して、table にインデックスを付けます。サブテーブルは、基となる table の指定した行と変数のみを含む新しい小規模な table です。
たとえば、テストの得点のみを含むサブテーブルを scores
から作成します。最初の 2 つの変数は非数値データをもつため、table にその他の変数を指定するインデックスを付けることできます。
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
を使用してデータ型で指定することです。この関数は、データ型が異なる多くの変数を含む大きな table がある場合に役立ちます。これにより、table 変数の指定に使用できる添字が返されます。
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 以降) table に対して演算を直接実行できます。ただし、そのすべての変数のデータ型で演算がサポートされている必要があります。詳細については、table および timetable での直接計算を参照してください。
たとえば、テストの得点が 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 より前は、この構文を使用できません。代わりに、中かっこを使用して table にインデックスを付けるか、Variables
アフォーダンスを使用してすべての table の行および変数を指定します。次の構文は、上記の演算と同じ結果を返し、すべてのリリースで機能します。
numericScores{:,:} = numericScores{:,:} .* 0.25 numericScores.Variables = numericScores.Variables .* 0.25
これらの構文を使用すると、table の内容が抽出されて 1 つの配列に連結され、計算が実行されてから、結果が table に代入し直されます。唯一の要件は、すべての変数のデータ型が連結可能であることです。
中かっこを使用して、
numericScores{1:5,["Test1","Test3"]}
のように行および変数のサブセットを指定することもできます。Variables
では常に、すべての行およびすべての変数が 1 つの配列に連結されます。
(R2023a 以降) table に対して多くの数学関数や統計関数を直接呼び出すこともできます。たとえば、各 table 変数内の最小値をその変数から減算します。
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)
任意の table の 1 つの変数での計算
"すべてのリリースで"、ドット表記と変数名を使用して、一度に 1 つの変数に対して計算を実行することもできます。たとえば、Test3
の最後の得点セットに補正相当の 5 点を追加します。
他の table 変数は個別の変数に対する演算の影響を受けないため、任意の table でこの種類の計算を実行できます。他の変数が数値データなのか非数値データなのかは関係ありません。
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
完全な table の行全体での計算
完全な table scores
には数値変数と非数値変数が含まれています。すべてのリリースで、table 内の指定した行および変数で計算を実行するには、中かっこによるインデックス付けまたはドット表記を使用します。
たとえば、生徒ごとにテストの得点の平均値、最小値、および最大値を求めます。これらの値は各行で計算します。それらを scores
に新しい table 変数として代入します。
簡単で便利な方法の 1 つとして、データを行列に抽出し、それに対して関数を呼び出してから、出力を新しい table 変数に代入することが挙げられます。たとえば、各行でテストの平均点を計算します。次に、それらを scores
の新しい table 変数 TestMean
に追加します。中かっこを使用して 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
を使用する場合は、table からデータを抽出する必要はありません。代わりに、rowfun
への入力引数として、table とデータに適用する関数を渡します。構文が少し複雑になりますが、rowfun
は、適用する関数が複数の入力引数を取る場合や複数の出力引数を返す場合に役立ちます。
たとえば、関数 bounds
を使用して、テストの最低点と最高点を求めます。関数 bounds
は 2 つの出力引数を返すため、rowfun
を使用してそれを scores
に適用します。rowfun
の出力は、変数 TestMin
と変数 TestMax
をもつ新しい table です。この場合、さらに "SeparateInputs"
を false
と指定して、各行の値が bounds
に渡される前にベクトルに結合されるようにします。
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
を連結して、これらの値が 1 つの table に含まれるようにします。
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
完全な table 内の指定した変数に沿った計算
各テストの平均点を求めます。これらの値は table 変数に沿って計算します。
最も簡単な方法は、mean
を使用する方法です。まず、中かっこを使用して Test1
、Test2
、および Test3
の数値データを行列に抽出します。次に、mean
を呼び出して行列の各列の平均値を計算します。出力は、各要素が table 変数の平均値である数値ベクトルです。
vars = ["Test1","Test2","Test3"]; meanOfEachTest = mean(scores{:,vars})
meanOfEachTest = 1×3
85.7000 84.3000 85.7000
table 変数に沿って計算を実行する別の方法としては、関数 varfun
を使用する方法があります。varfun
を使用する場合は、table からデータを抽出する必要はありません。代わりに、varfun
への入力引数として、table とデータに適用する関数を渡します。
varfun
を使用して平均点を計算します。出力は、table 変数にわかりやすい名前が付けられた新しい table です。
meanOfEachTest = varfun(@mean, ... scores, ... "InputVariables",vars)
meanOfEachTest=1×3 table
mean_Test1 mean_Test2 mean_Test3
__________ __________ __________
85.7 84.3 85.7
完全な table 内のデータ グループを使用した計算
table に 1 つ以上の "グループ化変数" がある場合は、table 内のデータ グループに対して計算を実行できます。グループ化変数の値を使用して、行が属するグループを指定できます。
たとえば、scores
の変数 School
の値は ABC School
と XYZ School
の 2 つです。これら 2 つの値を、scores
のデータ グループを表すカテゴリと見なすことができます。この場合、学校別に計算を実行できます。
関数を適用してグループ化変数を使用するには、関数 varfun
を使用します。mean
などの関数を指定し、varfun
を使用して、指定した各 table 変数にその関数を適用できます。グループ化変数も指定すると、varfun
は各 table 変数内の各グループに関数を適用します。
各テストの平均点を学校別に計算します。
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
を使用し、各 table 変数内のデータ グループに対して計算を実行することもできます。
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
ある table 変数内の特定の値を求めてから、別の table 変数内の対応する値を求めることが必要になる場合があります。このような場合は 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