Simpler code for aggregating data by sum

5 ビュー (過去 30 日間)
Clarisha Nijman
Clarisha Nijman 2019 年 1 月 10 日
コメント済み: Clarisha Nijman 2019 年 1 月 12 日
Hello,
given matrix A: A=[4 0.5;4 0.25;1 0.125; 2 0.2;4 0.6;3 0.2; 1 2/3; 2 1; 2 1/16;4 0.5]
asked: Aggregate data in first column by sum
desired result:
1.0000 0.7917
2.0000 1.2625
3.0000 0.2000
4.0000 1.8500
I composed a code, but it work half, it can not make the data unique. So it fails at : G=unique(List)
Can somebody tell me why it fails at that point? And is there a more straight forward code for this whole proces? Maybe inbuilt functions? Can I get some feedback pls?
This is my code:
List=[];
% Make list unique
for i=1:size(A,1)
F=A(A(:,1)==A(i,1),:); %subsetting all rows
ElementList=[A(i,1) sum(F(:,2))]; %adding the sum of the subset to a row
List=[List; ElementList] % saving row plus its aggregated sum to a list
end
G=unique(List) %making the list unique
kind regards,
  3 件のコメント
Akira Agata
Akira Agata 2019 年 1 月 10 日
Or simply:
A = [4 0.5;4 0.25;1 0.125; 2 0.2;4 0.6;3 0.2; 1 2/3; 2 1; 2 1/16;4 0.5];
B = splitapply(@sum,A(:,2),A(:,1));
The result is:
>>[unique(A(:,1)), B]
ans =
1.0000 0.7917
2.0000 1.2625
3.0000 0.2000
4.0000 1.8500
Clarisha Nijman
Clarisha Nijman 2019 年 1 月 11 日
Thank you dear friends!!! Suggestion woks perfect!

サインインしてコメントする。

採用された回答

OCDER
OCDER 2019 年 1 月 10 日
A=[4 0.5;4 0.25;1 0.125; 2 0.2;4 0.6;3 0.2; 1 2/3; 2 1; 2 1/16;4 0.5]
Results = [unique(A(:, 1)), accumarray(A(:, 1), A(:, 2))];
Results =
1.0000 0.7917
2.0000 1.2625
3.0000 0.2000
4.0000 1.8500
  4 件のコメント
OCDER
OCDER 2019 年 1 月 11 日
Check your results, as you have [3 4 2] unique combo.
A=[2.0000 3.0000 4.0000 0.01;
2.0000 3.0000 4.0000 0.05;
3.0000 2.0000 4.0000 0.01;
3.0000 4.0000 2.0000 0.02;
1.0000 2.0000 3.0000 0.03;
2.0000 3.0000 4.0000 0.00;
1.0000 2.0000 3.0000 0.02;
2.0000 3.0000 4.0000 0.01;
2.0000 3.0000 4.0000 0.01;
3.0000 2.0000 4.0000 0.07];
[UnqVal, ~, UnqGrpNum] = unique(A(:, 1:3), 'rows');
E = [UnqVal, accumarray(UnqGrpNum, A(:, end))];
E =
1.0000 2.0000 3.0000 0.0500
2.0000 3.0000 4.0000 0.0800
3.0000 2.0000 4.0000 0.0800
3.0000 4.0000 2.0000 0.0200
Clarisha Nijman
Clarisha Nijman 2019 年 1 月 12 日
Ok I see, you have to assign the unique groups a number, such that you can refer to them in the accumarray function. If would never come up with such a good idea. I worked with for loops and the code runs very very long. I indeed missed the unique combo[3 4 2] in my results.
Thanks a lot!!!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeTiming and presenting 2D and 3D stimuli についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by