Effacer les filtres
Effacer les filtres

Cumulative sum of groups

7 vues (au cours des 30 derniers jours)
PGrant
PGrant le 25 Avr 2018
Commenté : PGrant le 3 Juin 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 commentaires
Stephen23
Stephen23 le 25 Avr 2018
Modifié(e) : Stephen23 le 25 Avr 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 le 25 Avr 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...

Connectez-vous pour commenter.

Réponse acceptée

Stephen23
Stephen23 le 25 Avr 2018
Modifié(e) : Stephen23 le 25 Avr 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 commentaire
PGrant
PGrant le 25 Avr 2018
Thanks so much Stephen. Greatly appreciated!

Connectez-vous pour commenter.

Plus de réponses (1)

Lola Davidson
Lola Davidson le 3 Juin 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)
  1 commentaire
PGrant
PGrant le 3 Juin 2024
Beauty! Thanks Lola.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by