find the mean for each category and summarize it
    12 views (last 30 days)
  
       Show older comments
    
    Mohammad Aljarrah
 on 4 Mar 2020
  
    
    
    
    
    Commented: Mohammad Aljarrah
 on 4 Mar 2020
            Hello,
i have a table which consists of the following data
Category            value1        value2
1                            20                33
3                            23                43
2                            50                32
4                           13                32
4                            30                15
3                            33                 23
1                            60                12
2                            24                   43
i want to find the modulus mean value for each unique category and summarize them, e.g.
Category             value1            value2
1                                 23.54            15.33
2                                 35.44            42.55
3                                  29.33            33.32
4                                44.34               23.44
can anyone help me with this?
3 Comments
  the cyclist
      
      
 on 4 Mar 2020
				Sorry I deleted my question that you answered here! I decided to just illustrate solutions for both a numeric array and a table.
  Star Strider
      
      
 on 4 Mar 2020
				@Mohammad Aljarrah — How do you calculate those results?  
The mean of category 1 for example are 40 and 22.5 for ‘value1’ and ‘value2’ respectively.  How do you get 23.54 and 15.33?  
Accepted Answer
  the cyclist
      
      
 on 4 Mar 2020
        
      Edited: the cyclist
      
      
 on 4 Mar 2020
  
      For a numeric array, you can use the accumarray function to do this. That function is a bit tricky to learn the power of, and is also not really set up for operating on a matrix of data. However, Sean de Wolski provided a nice solution here, which I borrow below.
I illustrate both below.
M = [1 20 33
     3 23 43
     2 50 32
     4 13 32
     4 30 15
     3 33 23
     1 60 12
     2 24 43];
% On the original matrix
[~,~,c] = unique(M(:,1));
data = M(:,[2 3]);
sz = size(data);
meanByCategoryForMatrix = accumarray([repmat(c,sz(2),1), repelem((1:sz(2))',sz(1),1)],data(:),[],@mean)
% Or put them in a table first
Category = M(:,1);
value1 = M(:,2);
value2 = M(:,3);
tbl = table(Category,value1,value2);
meanByCategoryForTable = varfun(@mean,tbl,'GroupingVariables','Category','InputVariables',{'value1','value2'})
More Answers (1)
  Robert U
      
 on 4 Mar 2020
        Hi Mohammad Aljarrah,
the function that calculates the desired values can be exchanged according to your needs. I used the "mean" (within "arrayfun") to illustrate the solution to your described problem:
testData = [1,  20, 33
            3,  23, 43
            2,  50, 32
            4,  13, 32
            4,  30, 15
            3,  33, 23
            1,  60, 12
            2,  24, 43 ];
catTestData = unique(testData(:,1));
outMean = [catTestData cell2mat(arrayfun(@(dIn) mean(testData(testData(:,1) == dIn,2:3),1),catTestData,'UniformOutput',false))];
Kind regards,
Robert
See Also
Categories
				Find more on Logical 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!