Use rowfun to sum multiple columns by group

17 vues (au cours des 30 derniers jours)
Ledger Yu
Ledger Yu le 15 Oct 2019
Commenté : Guillaume le 15 Oct 2019
I have a table that looks like this:
Data =
date id flag1 flag2
2019-01-01 x1 1 1
2019-01-01 x1 1 0
2019-01-02 x2 0 0
2019-01-02 x2 0 1
...
The line below will sum "flag1" by "date":
rowfun(@sum, Data, 'groupingVariables','date','inputVariables','flag1')
But how do I apply this to both "flag1" and "flag2"? I tried:
rowfun(@sum, Data, 'goupingVariables','date','inputVariables',{'flag1','flag2'})
...and it throws out the following error:
Dimension argument must be a positive integer scalar within indexing range

Réponse acceptée

Guillaume
Guillaume le 15 Oct 2019
rowfun is not the correct function for this. rowfun applies the function by rows and consider the input variables as separate input arguments to the function. Indeed the 2nd argument to sum is the dimension to operate along so you get an error since your 2nd variable does not contain valid dimensions.
You want to apply the same function to the different variables of your table. The function for that is varfun:
varfun(@sum, Data, 'GroupingVariables', 'date', 'InputVariables', {'flag1','flag2'})
However, note that since R2018a we have groupsummary which is even easier to use and allows you to get several statistics at the same time:
groupsummary(Data, 'date', 'sum', {'flag1', 'flag2'})
is the equivalent to the above, but you could also do:
groupsummary(Data, 'date', 'weekly', {'sum', 'mean', 'std'}, {'flag1', 'flag2'})
to get weekly sum, mean and standard deviation at once.
  2 commentaires
Rik
Rik le 15 Oct 2019
You can still do something with rowfun, although I'm not sure this is what OP wants to do:
Data=table(...
datetime({'2019-01-01';'2019-01-01';'2019-01-02';'2019-01-02'}),...
{'x1';'x1';'x2';'x2'},...
[1;1;0;0],...
[1;0;0;1],...
'VariableNames',{'date','id','flag1','flag2'});
fun=@(flag1,flag2) sum([flag1;flag2]);
output=rowfun(fun,Data,...
'groupingVariables','date',...
'InputVariables',{'flag1','flag2'})
Guillaume
Guillaume le 15 Oct 2019
Oh yes, you can still use rowfun by writing your own function that takes multiple outputs, but the OP question is clearly meant to operate on variables not rows, so varfun is far more appropriate.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Dates and Time dans Help Center et File Exchange

Tags

Produits


Version

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by