ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

splitapply

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

説明

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

splitapply は、分割-適用-結合のワークフローにある 2 つのステップを組み合わせます。

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 Gender Height
  Name          Size            Bytes  Class     Attributes

  Gender      100x1             12212  cell                
  Height      100x1               800  double              

findgroups で性別のグループを指定します。

G = findgroups(Gender);

HeightG で指定されたグループに分割します。性別ごとの平均身長を計算します。出力引数の 1 行目は女性患者の平均身長を、2 行目は男性患者の平均身長を示します。

splitapply(@mean,Height,G)
ans = 2×1

   65.1509
   69.2340

患者のグループについて血圧測定値の差の分散を計算し、結果を表示します。血圧測定値は 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);

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)];

patients.mat から患者の体重、性別および喫煙状況を読み込みます。

load patients
whos Weight Gender Smoker
  Name          Size            Bytes  Class      Attributes

  Gender      100x1             12212  cell                 
  Smoker      100x1               100  logical              
  Weight      100x1               800  double               

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

G = findgroups(Gender,Smoker);
Y = splitapply(mystats,Weight,G)
Y = 4×3

  111.0000  131.0000  147.0000
  115.0000  131.0000  146.0000
  158.0000  181.5000  194.0000
  164.0000  181.0000  202.0000

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

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

患者データとグループ化変数をテーブルに読み込みます。

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

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

meanBMIFcn = @(h,w)mean((w ./ (h.^2)) * 703);

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

[G,results] = findgroups(GT);
meanBMI = splitapply(meanBMIFcn,DT,G);
results.meanBMI = meanBMI
results=4×3 table
     Gender     Smoker    meanBMI
    ________    ______    _______

    'Female'    false     21.672 
    'Female'    true      21.669 
    'Male'      false     26.578 
    'Male'      true      26.458 

患者のグループの身長の最小値、平均値および最大値を計算し、その結果をテーブルに返します。

multiStats.m というファイルに、入力ベクトルを受け入れてそのベクトルの最小値、平均値および最大値を返す関数を定義します。

% Copyright 2015 The MathWorks, Inc.

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

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

load patients
T = table(Gender,Height);
summary(T)
Variables:

    Gender: 100x1 cell array of character vectors

    Height: 100x1 double

        Values:

            Min          60   
            Median       67   
            Max          72   

患者の身長データを性別ごとにグループ化します。各グループに対する multiStats の出力を含む table を作成します。

[G,gender] = findgroups(T.Gender);
[minHeight,meanHeight,maxHeight] = splitapply(@multiStats,T.Height,G);
result = table(gender,minHeight,meanHeight,maxHeight)
result =

  2x4 table

     gender     minHeight    meanHeight    maxHeight
    ________    _________    __________    _________

    'Female'       60          65.151         70    
    'Male'         66          69.234         72    

入力引数

すべて折りたたむ

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

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 の行数と等しくなければなりません。

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

詳細

すべて折りたたむ

分割-適用-結合のワークフロー

"分割-適用-結合" のワークフローはデータ解析で一般的に知られています。このワークフローでは、解析者がデータをグループに分割し、各グループに関数を適用して、その結果を結合します。次の図にワークフローの一般的な例を示します。このワークフロー各部は findgroupssplitapply を使用して実装されています。

拡張機能

R2015b で導入