我是MATLAB的新手,我正在尝试组合具有相似值的行(我有数千行),例如
1 NaN
1 NaN
1 NaN
2 9
2 26.5
2 21.5
2 18
2 24.5
2 12
2 22.5
3 NaN
3 NaN
3 NaN
3 NaN
4 18.5
4 22
4 35.5
... ... ...
到
1 NaN NaN NaN
2 9 26.5 21.5 18 24.5 12 22.5
3 NaN NaN NaN NaN
4 18.5 22 35.5
任何人都可以帮我这个吗?
答案 0 :(得分:1)
使用普通数组无法做到这一点。每行必须具有相同数量的列,但您所需的输出不是这样。如果您愿意,可以使用单元格数组。
如果单元格数组是一个选项,解决此IMHO的最佳方法是使用accumarray/sort/cellfun
管道。首先使用accumarray
将属于同一ID的所有值组合在一起,这样就是您案例中的第一列。因此每个组都是一个单元阵列。但是,accumarray
的结果是每组中的值无序。因此,您需要分组的是值的位置。您要对这些位置进行排序,输出的是一个单元格数组,其中每个单元格都是您在原始数据中访问的索引列表。
然后调用cellfun
作为使用索引访问实际数据本身的最后一步。
假设您的数据存储在X
并且它是一个双列数组,我想到了这样的事情。
ind = (1 : size(X,1)).'; %'
out_ind = accumarray(X(:,1), ind, [], @(x) {sort(x)});
out = cellfun(@(x) X(x,2), out_ind, 'uni', 0);
我们得到:
>> celldisp(out)
out{1} =
NaN
NaN
NaN
out{2} =
9.0000
26.5000
21.5000
18.0000
24.5000
12.0000
22.5000
out{3} =
NaN
NaN
NaN
NaN
out{4} =
18.5000
22.0000
35.5000