find the mean for each category and summarize it

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 Kommentare

they are in numeric array
Sorry I deleted my question that you answered here! I decided to just illustrate solutions for both a numeric array and a table.
@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?

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

the cyclist
the cyclist am 4 Mär. 2020
Bearbeitet: the cyclist am 4 Mär. 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.
For a table, it is simpler. You can use grouping variables in the varfun function.
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'})

Weitere Antworten (1)

Robert U
Robert U am 4 Mär. 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

Kategorien

Produkte

Version

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by