Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

splitapply

データをグループに分割して関数を適用

説明

データをグループに分割し、グループに関数を適用するには、関数 findgroups と関数 splitapply を一緒に使用します。データのグループに対する計算の詳細については、データ グループに対する計算を参照してください。

Y = splitapply(func,X,G)XG で指定されたグループに分割し、関数 func を各グループに適用します。splitapply は、X から分割されたグループに対する func からの連結された出力を含む配列として Y を返します。入力引数 G は、X の対応する要素が属するグループを指定する、正の整数のベクトルです。GNaN 値が含まれる場合、splitapply は、X をグループに分割する際に X の対応する値を除外します。

G を作成するには、まず関数 findgroups を使用します。その後、splitapply を使用します。

Y = splitapply(func,X1,...,XN,G)X1,...,XN をグループに分割して func を適用します。関数 splitapply は、X1,...,XN の対応する要素を func への N 個の入力引数として使用して、グループごとに 1 度 func を呼び出します。

Y = splitapply(func,T,G) は、table T の変数をグループに分割して func を適用します。関数 splitapply は、テーブルの変数のデータ型に応じて、T の変数をベクトル、行列または cell 配列として扱います。TN 個の変数をもつ場合、funcN 個の入力引数を受け入れなければなりません。

[Y1,...,YM] = splitapply(___) は、変数をグループに分割して各グループに func を適用します。func は複数の出力引数を返します。Y1,...,YM には、入力データの変数から分割されたグループに対する func からの連結された出力が含まれます。func は、異なるクラスに属する出力引数を返すことができますが、各出力のクラスは func の毎回の呼び出しで同じでなければなりません。この構文では、前述の構文の入力引数のいずれかを使用できます。

func の出力引数の数は、X1,...,XN に指定された入力引数の数と一致する必要はありません。

すべて折りたたむ

グループ番号を使用して、患者の体重の測定値を喫煙者と非喫煙者の体重グループに分割します。次に、各グループの患者の平均体重を計算します。

サンプル ファイル patients.mat から患者データを読み込みます。

load patients
whos Smoker Weight
  Name          Size            Bytes  Class      Attributes

  Smoker      100x1               100  logical              
  Weight      100x1               800  double               

findgroups でグループを指定します。G の各要素は、患者がどのグループに属するかを指定するグループ番号です。グループ 1 には非喫煙者が含まれ、グループ 2 には喫煙者が含まれます。

G = findgroups(Smoker)
G = 100×1

     2
     1
     1
     1
     1
     1
     2
     1
     1
     1
      ⋮

患者の体重を表示します。

Weight
Weight = 100×1

   176
   163
   131
   133
   119
   142
   142
   180
   183
   132
      ⋮

G を使用して、配列 Weight を 2 つの体重グループに分割します。関数 mean を適用します。非喫煙者の平均体重は、喫煙者の平均体重より少し少なくなっています。

meanWeights = splitapply(@mean,Weight,G)
meanWeights = 2×1

  149.9091
  161.9412

患者のグループについて血圧測定値の差の分散を計算し、結果を表示します。血圧測定値は 2 つのデータ変数に保存されています。差を計算するには、2 つの入力引数を受け入れる関数を使用します。

患者 100 人の血圧測定値と喫煙データをデータ ファイル patients.mat から読み込みます。

load patients
whos Systolic Diastolic Smoker
  Name             Size            Bytes  Class      Attributes

  Diastolic      100x1               800  double               
  Smoker         100x1               100  logical              
  Systolic       100x1               800  double               

喫煙者と非喫煙者の収縮期および拡張期の血圧測定値の差の分散を計算する関数 func を定義します。func は 2 つの入力引数を必要とします。

func = @(x,y) var(x-y)
func = function_handle with value:
    @(x,y)var(x-y)

findgroups および splitapply を使用して患者データをグループに分割して差の分散を計算します。findgroups は、smokers にグループ識別子も返します。関数 splitapplyfunc をグループごとに 1 度呼び出し、2 つの入力引数として SystolicDiastolic を受け入れます。

[G,smokers] = findgroups(Smoker);
varBP = splitapply(func,Systolic,Diastolic,G)
varBP = 2×1

   44.4459
   48.6783

各グループの患者数を使用して、差の分散を含むテーブルを作成します。

numPatients = splitapply(@numel,Smoker,G);
T = table(smokers,numPatients,varBP)
T=2×3 table
    smokers    numPatients    varBP 
    _______    ___________    ______

     false         66         44.446
     true          34         48.678

患者のグループの体重データの最小値、中央値および最大値を計算し、その結果をグループごとに配列として返します。splitapply は、それぞれのグループの出力を他と区別できる形で出力引数を連結します。

最小値、中央値および最大値を行ベクトルとして返す関数を定義します。

mystats = @(x)[min(x) median(x) max(x)]
mystats = function_handle with value:
    @(x)[min(x),median(x),max(x)]

サンプル ファイル patients.mat から患者の体重、病院の場所、および喫煙状況を読み込みます。

load patients
whos Weight Location Smoker
  Name            Size            Bytes  Class      Attributes

  Location      100x1             14208  cell                 
  Smoker        100x1               100  logical              
  Weight        100x1               800  double               

findgroupssplitapply を使用して患者の体重をグループに分け、各グループの統計量を計算します。

G = findgroups(Location,Smoker);
Y = splitapply(mystats,Weight,G)
Y = 6×3

  111.0000  137.0000  194.0000
  120.0000  170.5000  189.0000
  118.0000  134.0000  189.0000
  115.0000  170.0000  191.0000
  117.0000  140.0000  189.0000
  126.0000  178.0000  202.0000

この例では、データおよびグループ化変数が列ベクトルなので、非スカラーの出力を行ベクトルとして返すことができます。Y の各行に、異なる患者グループの統計値が含まれています。

患者データのテーブルからボディマス指数 (BMI) の平均を計算します。患者を病院の場所および喫煙状況ごとのグループに分けます。

サンプル ファイル patients.mat から患者データとグループ化変数を table に読み込みます。(病院の場所を string 配列に変換します。)

load patients
DT = table(Height,Weight);
Location = string(Location);
GT = table(Location,Smoker);

患者のグループの体重と身長から平均 BMI を計算する関数を定義します。

meanBMIFcn = @(h,w)mean((w ./ (h.^2)) * 703)
meanBMIFcn = function_handle with value:
    @(h,w)mean((w./(h.^2))*703)

各グループの平均 BMI を含むテーブルを作成します。

[G,results] = findgroups(GT);
meanBMI = splitapply(meanBMIFcn,DT,G);
results.meanBMI = meanBMI
results=6×3 table
             Location              Smoker    meanBMI
    ___________________________    ______    _______

    "County General Hospital"      false     23.774 
    "County General Hospital"      true      24.865 
    "St. Mary's Medical Center"    false     22.968 
    "St. Mary's Medical Center"    true      24.905 
    "VA Hospital"                  false     23.946 
    "VA Hospital"                  true      24.227 

患者のグループの体重の最小値、平均値および最大値を計算し、その結果を table で返します。

患者データをテーブルに読み込みます。

load patients
T = table(Smoker,Weight)
T=100×2 table
    Smoker    Weight
    ______    ______

    true       176  
    false      163  
    false      131  
    false      133  
    false      119  
    false      142  
    true       142  
    false      180  
    false      183  
    false      132  
    false      128  
    false      137  
    false      174  
    true       202  
    false      129  
    true       181  
      ⋮

患者の体重を喫煙状況ごとにグループ化します。付属のサポート関数 multiStats は、入力配列の最小値、平均値、および最大値を 3 つの出力として返します。multiStats を喫煙者と非喫煙者に適用します。各グループに対する multiStats の出力を含む table を作成します。

[G,smoker] = findgroups(T.Smoker);
[minWeight,meanWeight,maxWeight] = splitapply(@multiStats,T.Weight,G);
result = table(smoker,minWeight,meanWeight,maxWeight)
result=2×4 table
    smoker    minWeight    meanWeight    maxWeight
    ______    _________    __________    _________

    false        111         149.91         194   
    true         115         161.94         202   

function [lo,avg,hi] = multiStats(x)
    lo = min(x);
    avg = mean(x);
    hi = max(x);
end

入力引数

すべて折りたたむ

データのグループに適用する関数。関数ハンドルとして指定します。

func が非スカラーの出力引数を返す場合、引数は splitapplyfunc の連続呼び出しからの出力引数を連結できる向きになっていなければなりません。たとえば、入力データの変数が列ベクトルである場合、func は出力引数としてスカラーか行ベクトルを返さなければなりません。

例: Y = splitapply(@sum,X,G)X にあるデータのグループの和を返します。

データ変数。ベクトル、行列または cell 配列として指定します。X の要素は、G の対応する要素で指定されたグループに属します。

X が行列の場合、splitapply は各列または各行を個別のデータ変数として扱います。splitapplyX の列と行のどちらをデータ変数として扱うかは、G の方向によって決まります。

グループ番号。正の整数のベクトルとして指定します。

  • X がベクトルまたは cell 配列の場合、GX と同じ長さでなければなりません。

  • X が行列の場合、G の長さは、G の方向に応じて X の列または行の数と等しくなければなりません。

  • 入力引数がテーブル T の場合、G は列ベクトルでなければなりません。G の長さは T の行数と等しくなければなりません。

データ変数。table として指定します。splitapply は各 table 変数を個別のデータ変数として扱います。

詳細

すべて折りたたむ

データ グループに対する計算

データ解析では、データ グループに対して計算を実行するのが一般的です。このような計算では、1 つ以上のデータ変数をデータ グループに分割し、各グループに対して計算を実行し、結果を 1 つ以上の出力変数に結合します。1 つ以上の "グループ化変数" を使用してグループを指定できます。グループ化変数の一意の値は、データ変数の対応する値が属するグループを定義します。

たとえばこの図は、6 行 1 列の数値ベクトルを 2 つのデータ グループに分け、各グループの平均を計算し、その出力を 2 行 1 列の数値ベクトルにまとめる単純なグループ化計算を示しています。6 行 1 列のグループ化変数には、ABXYZ の 2 つの一意の値があります。

Calculation that splits a data variable based on a grouping variable, performs calculations on individual groups of data by applying the same function, and then concatenates the outputs of those function calls

数値、テキスト、日時、カテゴリ、またはビンをもつグループ化変数を指定できます。

拡張機能

バージョン履歴

R2015b で導入