我想知道如何根据第一列汇总数据。例如:
我当前在矩阵中的数据:
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
您知道任何好的功能吗?
答案 0 :(得分:2)
您可以按以下方式使用unique
和splitapply
:
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)
这是我的方法:
使用unique
从第一列中查找所有唯一索引。
然后,我使用arrayfun
对特定索引的所有行求和。有时,arrayfun
被视作某种变相的循环,因此循环也可以。 (另请参见sum
和find array elements that meet a condition。)
最后,我设置了所需的输出格式。
请参见以下代码:
% 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