find the mean for each category and summarize it
    10 次查看(过去 30 天)
  
       显示 更早的评论
    
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 个评论
  the cyclist
      
      
 2020-3-4
				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
      
      
 2020-3-4
				@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?  
采纳的回答
  the cyclist
      
      
 2020-3-4
        
      编辑:the cyclist
      
      
 2020-3-4
  
      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'})
更多回答(1 个)
  Robert U
      
 2020-3-4
        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
另请参阅
类别
				在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



