1

假设我有一些table(或dataset)对象,在其变量A中包含一些因素X(具有n 个不同的值或“级别”)。还假设我有一些自定义聚合函数agg,它将一系列行作为输入,并返回一个汇总数字(又名“聚合”)作为输出。

统计数据分析中一个极其A常见的操作示例是根据X因子的值对行进行分组,并将其应用于agg由组中的行组成的数组。这种操作的结果应该是一个新的table(或dataset,取决于 的类A),具有n行和两个变量。这些变量中的第一个应该命名为X,并且应该包含因子 in的n 个不同值,第二个应该有一些合适的(最好是用户指定的)名称,并且应该包含应用于行组的结果相应的级别。XAaggX

正如我所说,这是在 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'});

另外,让XbeTrafficLightaggbe

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

(当然,我在agg这里使用它只是为了使示例尽可能简单。在实践agg中会远不那么简单。)

group_aggregate我正在考虑的典型函数通常将聚合函数、计算聚合的输出中列的名称、a table(或dataset)以及一个或多个要分组的变量的名称作为输入参数(以某种顺序)经过。因此,在此示例中,对此类函数的调用及其输出将如下所示

>> 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 回答