我有一个大的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
...
Date
是datenum
形式的日期
我需要对唯一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
,我都愿意接受。
答案 0 :(得分:4)
按日期分组,ID为unique(...,'rows')
,然后为subs
的多个列或meshgrid()
明确生成累积repmat()
,最后获取@nanmean
与accumarray()
:
% 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)]