How to calculate the median of a column depending on the value of another column?
    7 views (last 30 days)
  
       Show older comments
    
INTRODUCTION: I have two columns of values. The values of the first column are partially constant and the values of the second column are arbitrary ones.
GOAL: I want to build a third column with values of median for each group of constant value of the first column.
EXAMPLE:
A=[1  3;
1  2;
1  3;
2  4;
2  4;
2  3;
2     4;  
3  5;
3  1;
3  1;
3  1;
3  2;
4  3;
4  2];
B1=median(A(1:3,2));
B2=median(A(4:7, 2));
B3=median(A(8:12, 2));
B4=median(A(13:14, 2));
B=[B1 B2 B3 B4]';
PROBLEM: The number m of rows are typically much larger than only 14 and makes impossible to write the commands B1 until BN per hand.
I wonder if someone could tell me how to write some command lines that makes this automatically.
Thank you in advance for your help
Emerson
0 Comments
Accepted Answer
  Andrei Bobrov
      
      
 on 16 Sep 2012
        B = accumarray(A(:,1),A(:,2),[],@median);
out = [A, B(A(:,1))];
2 Comments
  Andrei Bobrov
      
      
 on 17 Sep 2012
				yes,
[c,c,c] = unique(A(:,1));
B = accumarray(c,A(:,2),[],@median);
out = [A, B(A(:,1))];
More Answers (1)
  Azzi Abdelmalek
      
      
 on 16 Sep 2012
        
      Edited: Azzi Abdelmalek
      
      
 on 16 Sep 2012
  
       B=squeeze(median(reshape(A(:,2),3,1,size(A,1)/3)))
%A must contains a multiple of 3 rows, if not, we have to complete with nan or zero values, write at the begening this code
 nc=mod(size(A,1),3);
 if nc>0; 
 A=[A;nan(3-nc,2)]
 end
5 Comments
  Azzi Abdelmalek
      
      
 on 17 Sep 2012
				
      Edited: Azzi Abdelmalek
      
      
 on 17 Sep 2012
  
			for our example
      idx1 =
     1     3      1 is repeating from index 1 to 3
     4     7      2 is repeating from index 4 to 7
     8    12      3 is repeating from index 8 to 12
    13    14      4 is repeating from index 13 to 14
B is changing a size because it's in the loop, B(1), B(2),... then B(k)
to make preallocation,( in case we work with big array)
B=zeros(1,numel(idx))
See Also
Categories
				Find more on Matrix Indexing in Help Center and File Exchange
			
	Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

