matlab - 具有附加列的数据透视表
问题描述
让我们有一个二维双数组,例如:
% 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 ];
对于每个给定的索引,我需要按权重最高的行进行透视/分组,这可以通过任何数据透视表| 分组依据功能(例如 pivottable
,SQL GROUP BY 或 MS Excel 数据透视表)
% Current Result
A1=pivottable(A0,[2],[],[3],{@max}); % Pivot Table
A1=cell2mat(A1); % Convert to array
>>A1=[1121 204;...
2212 483;...
4334 359 ]
如果我还需要恢复 ID 和 Category 列,我应该如何进行?
% Required Result
>>A1=[1 1121 204 1;...
3 2212 483 3;...
5 4334 359 2 ];
语法是 Matlab,但可以接受涉及其他语言(Java、SQL)的解决方案,因为它们可以转录到 Matlab 中。
解决方案
您可以使用splitapply
匿名函数,如下所示。
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
。然后这个函数所做的是保留所有使列最大化的行 index maximize_col
,并将其打包到一个单元格中。然后将结果转换为矩阵形式cell2mat
。
使用上述解决方案,如果每个组有多个最大化行,则所有这些行都会生成。要仅保留第一个,请将最后一行替换为
result = cell2mat(cellfun(@(c) c(1,:), result, 'uniformoutput', false));
它是如何工作的:这用于cellfun
将匿名函数@(c) c(1,:)
应用于每个单元格的内容。该函数仅保留第一行。或者,要保留最后一行,请使用@(c) c(end,:)
. 然后再次使用将结果转换为矩阵形式cell2mat
。
推荐阅读
- symfony - 给定“整数”、“App\Entity\Entreprise”类型的预期参数
- ubuntu - 使用 Mercurial 补丁“应用期间出现错误,请修复并重新刷新”
- unity3d - 在 Unity 中播放粒子系统
- delphi - 可以使 TDBEdit 上的 TextHint 属性起作用
- angular - 以角度在两个 sass 文件之间切换
- office-js - Office.js API 的 displayDialogAsync 方法未打开页面
- mysql - MySQL 可以输出相当于 perl 压缩整数吗?
- python - 如何在 PyTorch 中删除图层指定位置的节点
- r - R - 在城市地图上拟合网格并将数据输入到网格方块中
- ecmascript-6 - Lodash:根据条件在多级Json中查找并添加项目