首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带附加列的枢轴表

带附加列的枢轴表
EN

Stack Overflow用户
提问于 2019-04-21 22:12:33
回答 1查看 77关注 0票数 1

让我们有一个2D双数组,如:

代码语言:javascript
运行
复制
% Data: ID, Index, Weight, Category
A0=[1 1121 204 1;...
    2 2212 112 1;...
    3 2212 483 3;...
    4 4334 233 1;...
    5 4334 359 2;...
    6 4334 122 3 ];

对于每个给定的索引,我需要按权重最高的行进行枢轴/分组,这可以通过任何功能(如枢轴表、SQL或MS Excel PivotTable)来实现。

代码语言:javascript
运行
复制
% Current Result
A1=pivottable(A0,[2],[],[3],{@max}); % Pivot Table
A1=cell2mat(A1); % Convert to array

>>A1=[1121 204;...
      2212 483;...
      4334 359 ]

如果我还需要恢复ID和类别列,我应该如何进行?

代码语言:javascript
运行
复制
% Required Result
>>A1=[1 1121 204 1;...
      3 2212 483 3;...
      5 4334 359 2 ];

语法是Matlab,但涉及其他语言(Java、SQL)的解决方案是可以接受的,因为它们可以被转录到Matlab中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-21 22:42:25

您可以在匿名函数中使用splitapply,如下所示。

代码语言:javascript
运行
复制
grouping_col = 2; % Grouping column
maximize_col = 3; % Column to maximize 
[~, ~, group_label] = unique(A0(:,grouping_col));
result = splitapply(@(x) {x(x(:,maximize_col)==max(x(:,maximize_col)),:)}, A0, group_label);
result = cell2mat(result); % convert to matrix

是如何工作的:匿名函数@(x) {x(x(:,maximize_col)==max(···),:)}splitapply为每个组调用一次。函数作为输入提供一个子矩阵,该子矩阵包含具有索引grouping_col的列的相同值的所有行。然后,这个函数所做的是保留所有使用索引maximize_col最大化列的行,并将其打包到一个单元格中。然后由cell2mat将结果转换为矩阵形式。

使用上面的解决方案,如果每个组有几个最大化行,那么所有的都是生成的。要只保留第一个1,请将最后一行替换为

代码语言:javascript
运行
复制
result = cell2mat(cellfun(@(c) c(1,:), result, 'uniformoutput', false));

How it :这使用cellfun将匿名函数@(c) c(1,:)应用于每个单元格的内容。函数只保留第一行。或者,要保留最后一个行,请使用@(c) c(end,:)。然后使用cell2mat将结果转换为矩阵形式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55787225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档