2013-06-19 2 views
2

У меня есть большой набор данных (Matlab 1924014 на 5; ~ 73,4 МБ)Быстрее grpstats на большом наборе данных

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 s) последние три столбца для уникальных пар Date + id, так как иногда существует несколько строк для данной пары Дата + 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.

ответ

4

Группа по дате и ид с 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)] 
+0

Очень многообещающе! Менее 30 секунд на моей машине. Мне действительно нужно научиться использовать meshgrid/reshape. Просто проверяя вывод сейчас ... –

+0

время meshgrid, если это занимает достаточно много времени, например. 1/3 времени, я отправлю подход repmat к созданию субтитров. – Oleg

+0

Данные выглядят хорошо для меня! Это быстро для моих целей. Просто приуроченный к ней, 99% времени тратится на накопление. –

Смежные вопросы