Свертывание и усреднение избыточных записей в таблице MATLAB - PullRequest
1 голос
/ 02 ноября 2019

У меня есть следующая таблица MATLAB

item_a item_b score
a      b      1
a      b      1
b      c      3
d      e      2
d      e      1
d      e      0

Я хочу усреднить избыточные строки. Желаемый результат выглядит следующим образом:

item_a item_b score
a      b      (1+1)/2
b      c      3
d      e      (2+1+0)/3

Ответы [ 2 ]

3 голосов
/ 02 ноября 2019

Это классический сценарий для групп поиска, рабочий процесс split-apply. Если ваша таблица с именем t:

% Find mean values.
G = findgroups(t.item_a);
meanValues = splitapply(@mean,t.score,G);

% Create new table.
[~,i] = unique(G);
newTable = t(i,:);
newTable.score = meanValues

newTable содержит нужную таблицу.


См. эту страницу документации для получения дополнительных примеров.

1 голос
/ 02 ноября 2019

Это то, что я получил. Вы можете настроить окончательные результаты. Аналогичный пример есть в документации MATLAB. Вот две ключевые функции, accumarray и unique. Обратите внимание, что это решение работает только для входных данных массива, а не для типов данных ячейки. Управляя типами данных, вы также можете найти решение для таблиц и типов данных ячеек. В противном случае, я думаю, что цикл будет необходимо.

items = ['a'      'b'   
    'a'      'b'    
    'b'      'c'    
    'd'      'e'      
    'd'      'e'   
    'd'      'e' ];
scores = [1 1 3 2 1 0]';
[items_unique,ia,ic] = unique(items,'rows');
score_mean = accumarray(ic,scores, [], @mean);
result = {items_unique score_mean};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...