How to get statistical summary
1 view (last 30 days)
Show older comments
Hi,
I have below cell array,
Step 34
Step 56
Double 23
Stop 123
I want to get the summation and count of each category:
Desired output:
Step 90 2
Double 23 1
Stop 123 1
Continue 0 0
Here in the above example, no continue, but in some of my cases it exists. So for each scenario, I want to get the summation & count of: Step Double Stop Continue
0 Comments
Accepted Answer
Guillaume
on 16 Oct 2018
The way I'd do this is first convert your cell array to a table whose first column is of type categorical:
democell = {'Step', 34; 'Double', 56; 'Step', 23; 'Stop', 123}
demotable = table(categorical(democell(:, 1), {'Step', 'Double', 'Stop', 'Continue'}), cell2mat(democell(:, 2)), 'VariableNames', {'category', 'value'})
Your summation is then trivial:
varfun(@sum, demotable, 'GroupingVariables', 'category', 'InputVariables', 'value')
2 Comments
Guillaume
on 16 Oct 2018
Edited: Guillaume
on 16 Oct 2018
Then, you'd have to use more or less Kevin's answer. I'd still stuff the input into a table and change the first column to categorical as it's easier to work with. I'd do the calculation like this:
catnames = categories(demotable.category)
[~, id] = ismember(demotable.category, catnames);
result = table(catnames, accumarray(id, 1, [numel(catnames), 1]), accumarray(id, demotable.value, [numel(catnames), 1]), 'VariableNames', {'category', 'count', 'sum'})
More Answers (1)
Kevin Chng
on 16 Oct 2018
Edited: Kevin Chng
on 16 Oct 2018
A = ["Step" "Step" "Double" "Stop" "Continue"];
B = [ 34 56 23 123 0]
[c,~,d] = unique(A);
out = [c',accumarray(d,B),countcats(categorical(A))']
2 Comments
Kevin Chng
on 16 Oct 2018
Edited: Kevin Chng
on 16 Oct 2018
change to
out = table(c',accumarray(d,B),[zeros(numel(A(B==0)))';countcats(categorical(A(B>0)))'])
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!