Агрегация на таблице Matlab - PullRequest
       9

Агрегация на таблице Matlab

0 голосов
/ 29 октября 2018

У меня есть таблица ниже в Matlab, и я хочу агрегировать эту таблицу на основе столбца name ,

name      nums
'es'     '1,2,3'
'mo'     '4,3,1'
'al'     '2,3,1'
'es'     '40,2,8'
'es'     '1,2,5'
'mo'     '5,2,1'
'ta'     '9,4,2'
'al'     '2,6,1'
...

и это мой желаемый вывод (числа должны быть уникальными):

name     nums
'es'     '1,2,3,8,40,5'
'mo'     '4,3,1,5,2'
'al'     '2,3,1,6'
'ta'     '9,4,2'
...

и это мой код,

n,m = size(T);
for i = 1:n
    if ~ismember(name,mynewtab)
         mynewtab.input(i).nums = mynewtab.input(i).nums + nums;
    else
         mynewtab.input(i).nums = mynewtab.input(i).nums + nums;
         mynewtab.input(i).name = name;
    end
end

но в этом коде есть ошибки.

1 Ответ

0 голосов
/ 29 октября 2018

«В этом коде есть некоторые ошибки» - не самая большая проблема, вы должны начать с того, что + не определен так, как вы думаете для символьных массивов.

Этот код с использованием strjoin и unique должен делать то, что вы хотите ....

uNames = unique(tbl.name);    % Get unique names
c = cell( numel(uNames), 2 ); % Set up output (we'll turn this into a table later)
for ii = 1:numel(uNames)
    c{ii,1} = uNames{ii}; % Assign the name to 1st column
    % Join all strings in the 'nums' column, with a comma between them, when the 
    % value in the names column is equal to uNames{ii}
    c{ii,2} = strjoin( tbl.nums( strcmp( tbl.name, uNames{ii} ) ).', ',' );
end

tblOut = cell2table( c, 'VariableNames', {'name','nums'} );

Если вы хотите, чтобы в строках были только уникальные элементы, вам нужно будет использовать strsplit для разделения на запятые, а затем соединиться вместе после вызова unique ... Заменить строку c{ii,2} = ... со следующим:

vals = tbl.nums( strcmp( tbl.name, uNames{ii} ) ).';       % Get nums for this name
vals = cellfun( @(str)strsplit(str,','), vals, 'uni', 0 ); % Split all on ','
% Join the list of unique values back together. 
% Could use 'stable' argument of unique for order preservation.
c{ii,2} = strjoin( unique( [vals{:}] ), ',' ); 

Примечание: все было бы намного проще, если бы вы сохранили список чисел как массив фактических чисел, а не как массив символов!

...