大型数据集上更快的grpstats

时间:2013-06-19 16:10:44

标签: matlab grouping

我有一个大的Matlab数据集(1,924,014乘5; ~73.4 MB)

Date          id            a           b           c
...
733234        1467          1.2656      1.2718      51.16    
733235        1467          1.2732      1.2794      51.16    
733236        1467          1.2781      1.2844       51.5    
733236        1467            1.26         NaN        NaN    
733237        1467          1.3084         NaN        NaN    
733237        1467          1.3205         NaN        NaN    
733238        1467          1.3125      1.3188      53.85    
733238        1467             1.3         NaN        NaN    
...

Datedatenum形式的日期 我需要对唯一NaN + Date对的最后三列进行平均(忽略id s),因为对于给定的Date + id对,有时会有多行。

我想要的输出是

Date          id            mean_a      mean_b      mean_c
...
735234        1467          1.2656      1.2718      51.16    
735235        1467          1.2732      1.2794      51.16    
735236        1467          1.2691      1.2844       51.5    
735237        1467          1.3144         NaN        NaN    
735238        1467          1.3062      1.3188      53.85    
...

我希望能够使用

grpstats(myDataset, {'Date', 'id'}, 'mean')

但它太慢了。我希望这项任务可以在60秒内完成。我认为grpstats正在添加一个GroupCount列并为每个观察添加名称,这是我不需要的。

我怎样才能快速完成?无论他们是否使用grpstats,我都愿意接受。

1 个答案:

答案 0 :(得分:4)

按日期分组,ID为unique(...,'rows'),然后为subs的多个列或meshgrid()明确生成累积repmat(),最后获取@nanmeanaccumarray()

% Group by date and id
[un,~,pos] = unique(db(:,1:2),'rows');

% Produce row, col subs 
[col,row] = meshgrid(1:3,pos);

% Accumulate 
[un accumarray([row(:), col(:)], reshape(db(:,3:5),[],1),[],@nanmean)]