按第一列索引对不同行中的值进行分组

时间:2013-07-03 12:04:01

标签: matlab csv matrix

这个问题是MatLab (or any other language) to convert a matrix or a csv to put 2nd column values to the same row if 1st column value is the same?

的产物

如果

      A = [2 3 234 ; 2 44 33; 2 12 22; 3 123 99; 3 1232 45; 5 224 57]

第1列|第二栏|第3栏

2             3          234
2             44         33
2             12         22
3             123        99
3             1232       45
5             224        57

然后运行

    [U ix iu] = unique(A(:,1) ); 
    r= accumarray( iu, A(:,2:3), [], @(x) {x'} )

会显示错误

    Error using accumarray
    Second input VAL must be a vector with one element for each row in SUBS, or a
    scalar.

我想制作

第1列|第二列|第3列|第4列|第5列|第6列|第7列

2         3        234       44        33        12        22
3         123      99        1232      45
5         224      57

我知道如何使用for和if,但是花费太多时间来处理大数据。

我该怎么做?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

您在提供给上一个问题的解决方案中误导了accumarray。第一个参数iu是索引的向量,第二个参数应该是具有相同长度的值的向量。你在这里做的是指定一个矩阵作为第二个参数,实际上它的值比iu中的索引多两倍。

为了使其工作,您需要做的是为第二列和第三列创建索引向量(它们是相同的索引,而不是巧合!)并指定值的匹配列向量,像这样:

[U, ix, iu] = unique(A(:,1));
vals = reshape(A(:, 2:end).', [], 1);                    %'// Columnize values
subs = reshape(iu(:, ones(size(A, 2) - 1, 1)).', [], 1); %'// Replicate indices
r = accumarray(subs, vals, [], @(x){x'});

此解决方案适用于您要传递给accumarray的任意数量的列。