Cumulative sum of groups

7 visualizaciones (últimos 30 días)
PGrant
PGrant el 25 de Abr. de 2018
Comentada: PGrant el 3 de Jun. de 2024
I need the cumlative sum of the second column of Data grouped by (or reset at each change in) the first column of Data please:
Data = [[1;1;1; 2;2;2; 3;3;3], [1;0;1; 0;1;1; 0;1;0]]
Answer = [Data, [1;1;2; 0;1;2; 0;1;1]]
Data =
1 1
1 0
1 1
2 0
2 1
2 1
3 0
3 1
3 0
Answer =
1 1 1
1 0 1
1 1 2
2 0 0
2 1 1
2 1 2
3 0 0
3 1 1
3 0 1
  2 comentarios
Stephen23
Stephen23 el 25 de Abr. de 2018
Editada: Stephen23 el 25 de Abr. de 2018

@PGrant: please explain the logic of how to calculate Answer: assume that we a stupid and that every step need to be shown to us.

PGrant
PGrant el 25 de Abr. de 2018
Like a normal cumsum on column 2 of the Data with the difference being that it needs to restart for every change in column 1 of data resulting in column 3 of Answer. Columns 1 & 2 of Answer are just Data...

Iniciar sesión para comentar.

Respuesta aceptada

Stephen23
Stephen23 el 25 de Abr. de 2018
Editada: Stephen23 el 25 de Abr. de 2018
>> data = [1,1;1,0;1,1;2,0;2,1;2,1;3,0;3,1;3,0];
>> C = accumarray(data(:,1),data(:,2),[],@(v){cumsum(v)});
>> [data,vertcat(C{:})]
ans =
1 1 1
1 0 1
1 1 2
2 0 0
2 1 1
2 1 2
3 0 0
3 1 1
3 0 1
  1 comentario
PGrant
PGrant el 25 de Abr. de 2018
Thanks so much Stephen. Greatly appreciated!

Iniciar sesión para comentar.

Más respuestas (1)

Lola Davidson
Lola Davidson el 3 de Jun. de 2024
The grouptransform function was introduced in R2018b to help make problems like this a bit simpler. You can avoid the tricky cell array syntax that you need to use accumarray and just do this:
Data(:,3) = grouptransform(Data(:,2),Data(:,1),@cumsum)

Categorías

Más información sobre Logical en Help Center y File Exchange.

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by