Borrar filtros
Borrar filtros

Use rowfun to sum multiple columns by group

10 visualizaciones (últimos 30 días)
Ledger Yu
Ledger Yu el 15 de Oct. de 2019
Comentada: Guillaume el 15 de Oct. de 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

Respuesta aceptada

Guillaume
Guillaume el 15 de Oct. de 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 comentarios
Rik
Rik el 15 de Oct. de 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 el 15 de Oct. de 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.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Dates and Time en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by