根据第一列值汇总数据

时间:2019-09-18 05:45:12

标签: arrays matlab matrix aggregate

我想知道如何根据第一列汇总数据。例如:

我当前在矩阵中的数据:

c1
1  1 2 3 4 5 6
1  1 2 3 4 5 6
1  1 2 3 4 5 6
2  1 2 3 4 5 6
3  1 2 3 4 5 6
3  1 2 3 4 5 6

结果数据:

c1
1  3 6 9 12 15 18
2  1 2 3 4  5  6
3  2 4 6 8  10 12

您知道任何好的功能吗?

4 个答案:

答案 0 :(得分:2)

您可以按以下方式使用uniquesplitapply

c1 = [1  1 2 3 4 5 6
      1  1 2 3 4 5 6
      1  1 2 3 4 5 6
      2  1 2 3 4 5 6
      3  1 2 3 4 5 6
      3  1 2 3 4 5 6]; % data
[u, ~, w] = unique(c1(:,1)); % u: unique elements; w: integer that indicates the group
result = [u splitapply(@(x)sum(x,1), c1(:,2:end), w)]; % sum over 1st dim within a group

答案 1 :(得分:1)

这是我的方法:

  1. 使用unique从第一列中查找所有唯一索引。

  2. 然后,我使用arrayfun对特定索引的所有行求和。有时,arrayfun被视作某种变相的循环,因此循环也可以。 (另请参见sumfind array elements that meet a condition。)

  3. 最后,我设置了所需的输出格式。

请参见以下代码:

% Input data.
c1 = [
  1 1 2 3 4 5 6
  1 1 2 3 4 5 6
  1 1 2 3 4 5 6
  2 1 2 3 4 5 6
  3 1 2 3 4 5 6
  3 1 2 3 4 5 6
]

% Get unique indices from first column.
idx = unique(c1(:, 1));

% For all unique indices calculate sum over all rows with specified index.
result = arrayfun(@(x) sum(c1((c1(:, 1) == x), 2:end), 1), idx, 'UniformOutput', false);

% Set up proper output.
result = [idx, vertcat(result{:})]


c1 =
   1   1   2   3   4   5   6
   1   1   2   3   4   5   6
   1   1   2   3   4   5   6
   2   1   2   3   4   5   6
   3   1   2   3   4   5   6
   3   1   2   3   4   5   6

result =
    1    3    6    9   12   15   18
    2    1    2    3    4    5    6
    3    2    4    6    8   10   12

希望有帮助!

答案 2 :(得分:1)

这是使用线性代数的另一种方法:

{{1}}

答案 3 :(得分:0)

如果输入数据的第一列中只有几个唯一数字,那么,我宁愿使用以下代码

c1 = [1  1 2 3 4 5 6
1  1 2 3 4 5 6
1  1 2 3 4 5 6
2  1 2 3 4 5 6
3  1 2 3 4 5 6
3  1 2 3 4 5 6];

uidx= unique(c1(:,1));

c2= zeros(length(uidx), size(c1,2));

for ii = 1:length(uidx)
   idx = (c1(:,1)==uidx(ii));
   c2(ii,:) = [uidx(ii) sum(c1(idx,2:end),1)];
end

disp(c2)
     1     3     6     9    12    15    18
     2     1     2     3     4     5     6
     3     2     4     6     8    10    12