提取由另一列分组的某列上具有[最大值/最小值]的行



我想提取col3上具有最大值并按col2分组的行。

例如,如果我有:

%    col1  col2  col3
M = [112   1     78
112   2     2
120   2     77
101   1     86
112   3     103]

MAX on col3 GROUP BY col2的结果是(行顺序无关紧要(:

%    col1  col2  col3
R = [120   2     77
101   1     86
112   3     103]

实际上我使用的是:

M       = sortrows(M,[2,3])
[~,ind] = unique(M(:,2),'last')
R       = M(ind,:)

但我发现这个解决方案过于复杂,你有更简单的解决方案吗?我想避免使用matlabtable

这可能比最初的解决方案更快,但似乎更复杂:

function out = getmax (x)
[~, out] = max (x);
end
idx = accumarray(M(:,2), 1:size(M,1), [], @(x) x(getmax(M(x,3))));
R = M(idx, :);

编辑:注意,如果M(:,2)中的值不形成从1开始的连续正整数范围的排列(并且可能具有重复(,则它们应该由unique变换。

[~, ~, col2] = unique (M(:,2));
idx = accumarray(col2, 1:size(M,1), [], @(x) x(getmax(M(x,3))));
R = M(idx, :);

使用findgroups和splitapply:

>> G = findgroups(M(:,2));
>> Y = arrayfun(@(x) find(M(:,3)==x),splitapply(@max,M(:,3),G));
>> M(Y,:)
ans =
101     1    86
120     2    77
112     3   103

相关内容

  • 没有找到相关文章

最新更新