check the repeated values...count them and find mean
Show older comments
I have suppose 2 columns as follows:
1 22
2 44
1 88
5 100
7 200
2 600
8 45
9 76
7 24
4 54
what i want is: like 1 is repeated 2 times...now add the respective values from column 2 i.e 22 and 88 and add them and divide by 2(because 1 is occuring 2 times)..and do it for all values of column 1..i.e
1 (22+88)/2
2 (44+600)/2
5 (100)/1
7 (200+24)/2
8 (45)/1
9 (76)/1
4 (54)/1
please help me...i m stuck up with this problem... :(
Accepted Answer
More Answers (2)
Roger Stafford
on 29 Jun 2013
Call your first array 'a' and the second 'b'.
[u,~,ix] = unique(a(:,1));
b = [u,accumarray(ix,a(:,2))./accumarray(ix,1)];
These are arranged in order of ascending unique values from the first column of a. If you want them in the order first encountered, you need to use the second argument of 'unique'.
One accumarray() call is enough:
A = [1 22; ...
2 44; ...
1 88; ...
5 100; ...
7 200; ...
2 600; ...
8 45; ...
9 76; ...
7 24; ...
4 54];
B = accumarray(A(:,1), A(:,2), [], @mean)
I'm not new to Matlab. But this is the first time I could apply accumarray successfully.
4 Comments
aditi
on 30 Jun 2013
aditi
on 30 Jun 2013
Jan
on 30 Jun 2013
@aditi: No, you do not need the unique command. And when you run "my code" you do not get this error message. You get the error, when the first column contain values, which are not positive integers. But your example did not show such values. So obvious your example was a too strong simplification. In this case you need.
[dum1, dum2, index] = unique(zz(:,1));
sm = accumarray(index, zz(:,2), [], @mean)
This is very similar to Roger's code, it only let accumarray perform the calculation of the mean, while Roger's accumarray builds the sum and divides by the number of occurrences determined by a second accumarray.
aditi
on 1 Jul 2013
Categories
Find more on Data Preprocessing 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!