Create mean y values by multiple groups in one graph

1 view (last 30 days)
Dear all, I have a snippet of my panel
id Year y Cat1 Cat2 Cat3 Cat4
1 2000 45 1 0 0 0
1 2001 56 1 0 0 0
1 2002 23 1 0 0 0
1 2003 56 1 0 0 0
1 2004 45 1 0 0 0
2 2000 45 0 1 0 0
2 2001 90 0 1 0 0
2 2002 35 0 1 0 0
2 2003 79 0 1 0 0
2 2004 32 0 1 0 0
Ofcourse my full panel has id=30 and Year=5 .
I want to find the mean values of y by Cat1, up to Cat4, when each Cat takes the value of 1. And then I want to plot a bar chart of these mean values of y against the X axis that will contain the labels Cat1,..., Cat4 in a vertical position.
Is that possible to do that in Matlab?
If it is not clear, please let me know!
Many thanks in advance!
  4 Comments
Mann Baidi
Mann Baidi on 2 Apr 2024
Okay, thanks for the clarification.
As per my understanding of the question, you would like to plot the data from Cat1 Cat2.... and y column, right?

Sign in to comment.

Answers (2)

Star Strider
Star Strider on 2 Apr 2024
Edited: Star Strider on 2 Apr 2024
Try this —
T1 = array2table([1 2000 45 1 0 0 0
1 2001 56 1 0 0 0
1 2002 23 1 0 0 0
1 2003 56 1 0 0 0
1 2004 45 1 0 0 0
2 2000 45 0 1 0 0
2 2001 90 0 1 0 0
2 2002 35 0 1 0 0
2 2003 79 0 1 0 0
2 2004 32 0 1 0 0], 'VariableNames',{'id','Year','y','Cat1','Cat2','Cat3','Cat4'})
T1 = 10x7 table
id Year y Cat1 Cat2 Cat3 Cat4 __ ____ __ ____ ____ ____ ____ 1 2000 45 1 0 0 0 1 2001 56 1 0 0 0 1 2002 23 1 0 0 0 1 2003 56 1 0 0 0 1 2004 45 1 0 0 0 2 2000 45 0 1 0 0 2 2001 90 0 1 0 0 2 2002 35 0 1 0 0 2 2003 79 0 1 0 0 2 2004 32 0 1 0 0
Cat_mean = NaN(2, 4);
for k = 1:4
Cat_mean(:,k) = accumarray(1+T1{:,k+3}, 1, [], @(x)mean(T1.y(x)));
end
Cat_mean
Cat_mean = 2x4
45 45 45 45 45 45 45 45
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
There are several ways to do this in MATLAB. This is the approach that I usually use.
for k = 1:4
Catu(:,k) = unique(T1{:,k+3},'stable');
end
Catu
Catu = 2x4
1 0 0 0 0 1 0 0
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
figure
hold on
for k = 1:4
bar(k,Cat_mean(:,k), 'stacked')
end
hold off
xlabel('Cat')
ylabel('Counts')
EDIT — Added bar chart.
.
  4 Comments
ektor
ektor on 2 Apr 2024
can this grapn be inverted and put the names instead of 1 2?
Many thanks
Star Strider
Star Strider on 2 Apr 2024
The easiest way —
T1 = array2table([1 2000 45 1 0 0 0
1 2001 56 1 0 0 0
1 2002 23 1 0 0 0
1 2003 56 1 0 0 0
1 2004 45 1 0 0 0
2 2000 45 0 1 0 0
2 2001 90 0 1 0 0
2 2002 35 0 1 0 0
2 2003 79 0 1 0 0
2 2004 32 0 1 0 0], 'VariableNames',{'id','Year','y','Cat1','Cat2','Cat3','Cat4'})
T1 = 10x7 table
id Year y Cat1 Cat2 Cat3 Cat4 __ ____ __ ____ ____ ____ ____ 1 2000 45 1 0 0 0 1 2001 56 1 0 0 0 1 2002 23 1 0 0 0 1 2003 56 1 0 0 0 1 2004 45 1 0 0 0 2 2000 45 0 1 0 0 2 2001 90 0 1 0 0 2 2002 35 0 1 0 0 2 2003 79 0 1 0 0 2 2004 32 0 1 0 0
% Cat_mean = NaN(2, 4);
for k = 1:2%4
Cat_mean(:,k) = accumarray(T1{:,k+3}(T1{:,k+3} ~= 0), 1, [], @(x)mean(T1.y(x)));
end
Cat_mean
Cat_mean = 1x2
45 45
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
for k = 1:4
Catu(:,k) = unique(T1{:,k+3},'stable');
end
Catu
Catu = 2x4
1 0 0 0 0 1 0 0
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
figure
hold on
for k = 1:2%4
bar(k,Cat_mean(:,k), 'stacked')
end
hold off
set(gca,'XTick',(1:4), 'XTickLabel',compose('Cat%d',1:4))
% xlabel('Cat')
ylabel('Counts')
Another option is to use categorical tick labels, however that causes significant problems if you want to add anything numeric later, so I would not recommend it.
.

Sign in to comment.


Adam Danz
Adam Danz on 2 Apr 2024
Edited: Adam Danz on 2 Apr 2024
Use groupsummary to compute the means of each group. Then plot the results using bar() with categorical x values.
This assumes "1" does not appear in more than 1 group.
% Input table
T = array2table([1 2000 45 1 0 0 0
1 2001 56 1 0 0 0
1 2002 23 1 0 0 0
1 2003 56 0 1 0 0
1 2004 45 0 1 0 0
2 2000 45 0 0 1 0
2 2001 90 0 0 1 0
2 2002 35 0 0 0 1
2 2003 79 0 0 0 1], ...
'VariableNames',{'id','Year','y','Cat1','Cat2','Cat3','Cat4'});
% Compute group means
groups = {'Cat1','Cat2','Cat3','Cat4'};
mu = groupsummary(T,groups,'mean','y')
mu = 4x6 table
Cat1 Cat2 Cat3 Cat4 GroupCount mean_y ____ ____ ____ ____ __________ ______ 0 0 0 1 2 57 0 0 1 0 2 67.5 0 1 0 0 2 50.5 1 0 0 0 3 41.333
% Get the group order so ensure the groups are in the same order as the
% means.
groupOrder = varfun(@find,mu(:,1:numel(groups)),'OutputFormat','uniform');
means = mu.mean_y(groupOrder);
% Plot results
bar(categorical(groups),means)
ylabel('mean')

Tags

Community Treasure Hunt

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

Start Hunting!