1

splitapply関数を使用する他の誰かの Matlab コードを実行しようとしていますが、これは R2018a でのみ使用できます。現在 R2015a を使用しています。(一時的に)使用できる同じ目的を達成する単純な(効率は劣りますが)代替実装はありますか?

4

3 に答える 3

1

実はsplitapplyR2015bで導入されました。

とにかく、 splitapplyのドキュメントで説明されているように、この関数は Split-Apply-Combine ワークフローの 2 つのステップを結合します。

次の図 (splitapplyオンライン ドキュメントから) は、プロセスを説明しています。

ここに画像の説明を入力

基本的にsplitapplyは、関数findgroupsを使用して入力データをグループ化し、データの各グループに関数を適用します。

残念ながら、これも R2015b でfindgroups導入されたため、主な問題はそれを実装する方法を見つけることです。

の「一般的な」バージョンを実装するにはfindgroups、いくつかの異なるタイプのデータセットで動作できるようにするために、多くの時間が必要になる場合があります。

まず、使用する必要がある特定のデータセットに一致する形式で実装を開始できます。

基本的には、独自の関数を使用して単純化されたバージョンを実装できます。

アイデアは、取得するためにそれを使用することです:

  • データセット内の一意のエントリのリスト: これらはグループになります
  • それらのグループに対応するデータセット内のエントリのインデックス

データセット内のグループのインデックスを取得したら、それらを使用してデータセットの値を選択し、適用する必要がある関数の入力として使用できます。

以下に、 のオンライン ヘルプで提供されている例を再現した実装例を示しsplitapplyます。

もちろん、これは「すべての」データセットで機能する「一般的な」実装ではありません。実際には、例の特定の入力に対して機能しますが、出発点になることを願っています。

splitapply のオンライン例

オンライン ドキュメントの抜粋

load patients
meanBMIFcn = @(h,w)mean((w ./ (h.^2)) * 703);
DT = table(Height,Weight);
GT = table(Gender,Smoker);
[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 

可能な実装

clear w

% Find the unique entries in the first dataset
[uni_list_1,~,uni_idx_1]=unique(Gender)
n_group_1=length(uni_list_1)

% Find the unique entries in the second dataset
[uni_list_2,~,uni_idx_2]=unique(Smoker)
n_group_2=length(uni_list_2)

% Get the indices of the occurrencies of the combinatin of the two
% entities
for g1=1:length(uni_list_1)
   for g2=1:length(uni_list_2)
      data_set.(uni_list_1{g1}).(['cond_' num2str(uni_list_2(g2))])=(uni_idx_1 == g1) & (uni_idx_2 == g2)
   end
end

% Define the function to be applied
meanBMIFcn = @(h,w)mean((w ./ (h.^2)) * 703);

% Extract the data matching the desired conditions and use them as input to
% the disired function
for g1=1:length(uni_list_1)
   for g2=1:length(uni_list_2)
      height=Height(data_set.(uni_list_1{g1}).(['cond_' num2str(uni_list_2(g2))]));
      weight=Weight(data_set.(uni_list_1{g1}).(['cond_' num2str(uni_list_2(g2))]));
      result.data_set.(uni_list_1{g1}).(['cond_' num2str(uni_list_2(g2))])=meanBMIFcn(height,weight)
   end
end

出力

出力は、フィールドがグループと追加の条件である構造体の形式です

>> result
result = 
    data_set: [1x1 struct]
>> result.data_set
ans = 
    Female: [1x1 struct]
      Male: [1x1 struct]
>> result.data_set.Female
ans = 
    cond_0: 21.6721
    cond_1: 21.6686
>> result.data_set.Male
ans = 
    cond_0: 26.5775
    cond_1: 26.4584
于 2018-04-02T09:02:01.060 に答える