Azzera filtri
Azzera filtri

Cumulative sum of groups

2 visualizzazioni (ultimi 30 giorni)
PGrant
PGrant il 25 Apr 2018
Commentato: PGrant il 3 Giu 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 Commenti
Stephen23
Stephen23 il 25 Apr 2018
Modificato: Stephen23 il 25 Apr 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 il 25 Apr 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...

Accedi per commentare.

Risposta accettata

Stephen23
Stephen23 il 25 Apr 2018
Modificato: Stephen23 il 25 Apr 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 Commento
PGrant
PGrant il 25 Apr 2018
Thanks so much Stephen. Greatly appreciated!

Accedi per commentare.

Più risposte (1)

Lola Davidson
Lola Davidson il 3 Giu 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)

Categorie

Scopri di più su Multidimensional Arrays in Help Center e File Exchange

Prodotti

Community Treasure Hunt

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

Start Hunting!

Translated by