How to do a group by in matlab
Show older comments
Hi, I have the following data:
data=[10 1 2 3; 11 4 5 6;10 0 20 30; 11 4 5 6; 12 7 8 9; 17 40 50 60]
I want to look for:
lookfor=[10;11]
and get the following result:
anwser=[10 1 22 33; 11 8 10 12]
So it's a group by...
I'm looking for a dynamic anwser, data matrix and lookfor matrix will vary and be much more bigger.
thank you in advance for your precious anwsers.
2 Comments
Azzi Abdelmalek
on 26 May 2013
Edited: Azzi Abdelmalek
on 26 May 2013
It's grouped by what? how did you get 1,22 and 33?
Gimpy
on 26 May 2013
Accepted Answer
More Answers (2)
Andrei Bobrov
on 27 May 2013
[i1,i2] = ismember(data(:,1),lookfor);
d2 = data(i1,2:end);
[j1,j2] = ndgrid(i2(i1),1:size(d2,2));
anwser = [lookfor,accumarray([j1(:),j2(:)],d2(:))];
Lola Davidson
on 3 Jun 2024
0 votes
For those still stumbling on this, MATLAB now has several more functions to help with grouping workflows, including groupsummary and pivot.
For this problem, if you are expecting several different lookfor values on the same dataset, it may be faster to compute all the sums with groupsummary in one go:
[sums,grps] = groupsummary(data(:,2:end),data(:,1),"sum");
out = [grps sums]
On the other hand, if you only want to compute a small subset of the grouped sums per dataset, it may be quicker to filter down with ismember first, as others have mentioned.
idx = ismember(data(:,1),lookfor);
[sums,grps] = groupsummary(data(idx,2:end),data(idx,1),"sum");
out = [grps sums]
Categories
Find more on MATLAB in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!