Main Content

table に数値データと非数値データの両方が含まれている場合の計算

この例では、数値データと非数値データの両方が含まれている場合に table 内のデータで計算を行う方法を示します。数値データを含む table 変数を特定したら、中かっこまたはドット表記を使用してこれらの変数内のデータにアクセスできます。その後、数値データに対して算術演算を実行したり関数を呼び出したりして、結果を table に代入し直すことができ、そのすべてを 1 行のコードで実行できます。また、関数 rowfun を使用して table の各行で計算を行うことや、関数 varfun を使用して変数に沿って計算を行うこともできます。table 内にデータ グループがある場合は、関数 groupsummaryrowfun、および varfun を使用して、table 内のグループごとに計算を実行できます。

table へのサンプル データの読み込み

関数 readtable を使用して、CSV (コンマ区切り値) ファイル testScores.csv から table へデータを読み取ります。このサンプル ファイルには、2 つの異なる学校に通う生徒 10 人のテストの得点が含まれています。出力 table には、数値データをもつ変数とテキスト データをもつ他の変数が含まれます。これらの変数の 1 つ School は、固定されたセットの値、つまりカテゴリをもっています。これらのカテゴリは、この table 内の 2 つの生徒グループを表します。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  

数値データをもつサブテーブルの作成

数値データを操作する単純な方法の 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 に追加します。中かっこを使用して Test1Test2、および 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   

scoresminmaxTest を連結して、これらの値が 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 を使用する方法です。まず、中かっこを使用して Test1Test2、および 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 SchoolXYZ 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

参考

| | | | |

関連するトピック