1

変数の中に何らかの要因( n 個の異なる値、または「レベル」を持つ) を含むtable(またはdataset) オブジェクトがあるとします。また、一連の行を入力として取り、出力として単一の集計値 (別名「集計」) を返すカスタム集計関数があるとします。AXagg

統計的データ分析で非常に一般的な操作の例はA、因子の値に従っての行をグループ化し、グループ内の行で構成される配列Xに適用することです。aggこのような操作の結果は、 n行と 2 つの変数を持つ新しいtable(またはdataset、のクラスに応じてA) になります。これらの変数の最初の 1 つには という名前を付け、 の係数のn 個の個別の値を含める必要があります。2 番目の変数には、適切な (できればユーザー指定の) 名前を付けて、行グループに適用した結果を含める必要があります。対応するレベル。XXAaggX

私が言ったように、これは MATLABtabledatasetオブジェクトなどのデータ構造に対して実行する非常に標準的な操作であるため、それを行う組み込みの方法があると期待していましたが、見つかりません。


たとえば、次のAように定義します。

% "data" table
A = cell2table({
                'even', 'red', 'spades', 38, 0.9837;
                'even', 'red', 'hearts', 19, 0.5695;
                'even', 'red', 'diamonds', 89, 0.2629;
                'even', 'red', 'diamonds', 98, 0.3578;
                'even', 'red', 'diamonds', 92, 0.2596;
                'even', 'red', 'diamonds', 69, 0.5751;
                'even', 'red', 'diamonds', 77, 0.6318;
                'even', 'yellow', 'clubs', 22, 0.6917;
                'even', 'green', 'spades', 35, 0.6674;
                'even', 'green', 'hearts', 67, 0.7896;
                'even', 'green', 'hearts', 49, 0.5025;
                'even', 'green', 'hearts', 64, 0.5318;
                'odd', 'red', 'spades', 22, 0.5587;
                'odd', 'red', 'hearts', 51, 0.9122;
                'odd', 'red', 'diamonds', 74, 0.3343;
                'odd', 'red', 'diamonds', 69, 0.2911;
                'odd', 'yellow', 'spades', 33, 0.2653;
                'odd', 'yellow', 'spades', 38, 0.2549;
                'odd', 'yellow', 'diamonds', 1, 0.2064;
                'odd', 'yellow', 'diamonds', 25, 0.8257;
                'odd', 'green', 'spades', 64, 0.4348;
                'odd', 'green', 'hearts', 59, 0.8644;
                'odd', 'green', 'hearts', 4, 0.6374;
                'odd', 'green', 'hearts', 11, 0.3354
               }, 'VariableNames', ...
               {'Parity', 'TrafficLight', 'Suit', 'order', 'prevalence'});

また、みましょXTrafficLightagg

agg = @(t) size(t, 1);

(もちろん、aggここでは例をできるだけ単純にするためにこれを使用しています。実際aggには、それほど単純ではありません。)

私が考えている典型的なgroup_aggregate関数は通常、入力引数として (何らかの順序で) 集計関数、計算された集計の出力の列の名前table(またはdataset)、およびグループ化する 1 つ以上の変数の名前を取ります。に。したがって、この例では、そのような関数の呼び出しとその出力は次のようになります。

>> group_aggregate(agg, 'nrows', A, {'TrafficLight'})

ans =

    TrafficLight    nrows
    ____________    _____

    'green'          8   
    'red'           11   
    'yellow'         5   

ところで、上記の結果を得るために、私はこの絶望的な小さな獣を呼び起こしました。

>> tmp = cellfun(@(s) {s agg(A(strcmp(A.TrafficLight, s), :))}, ...
unique(A.TrafficLight), 'un', 0);
>> cell2table(cat(1, tmp{:}), 'VariableNames', {'TrafficLight' 'nrows'})

たとえば、X変数のさまざまなクラスの値などに対して、組み込みのソリューションがより堅牢であることを願っています。

4

2 に答える 2

2

tableこの目的のためだけの方法はわかりませんが、集計については、次を参照してaccumarrayください。

>> [lights,ia,ic]=unique(A.TrafficLight);
>> nrows = accumarray(ic,1);
>> cell2table([lights num2cell(nrows)],'VariableNames', {'TrafficLight' 'nrows'})
ans = 
    TrafficLight    nrows
    ____________    _____
    'green'          8   
    'red'           11   
    'yellow'         5   
于 2014-02-07T00:21:01.347 に答える
0

私は質問が1歳であることを知っています...

accumarray とは別の方法を使用します。私は集計 http://www.mathworks.com/help/stats/tabulate.html?s_tid=gn_loc_dropを使用します

私はまだ古いバージョンのMatlabも持っているので、データセットを使用しています。この場合(ただし、「テーブル」でも機能すると思います)、コードは次のようになります。

TrafficLight_stats=tabulate(A.TrafficLight);
Agg_table=mat2dataset(TrafficLight_stats,'VarNames',{'TrafficLight','nrows','Perc'});

Agg_table = 

TrafficLight    nrows       Perc         
'red'           [11]        [45.8333]
'yellow'        [ 5]        [20.8333]
'green'         [ 8]        [33.3333]
于 2015-02-25T15:39:37.630 に答える