R kumulative Summe nach Bedingung mit Reset

Ich habe einen Vektor von Zahlen in einem data.frame wie unten.

df <- data.frame(a = c(1,2,3,4,2,3,4,5,8,9,10,1,2,1))

Ich muss eine neue Spalte erstellen, die eine laufende Anzahl von Einträgen enthält, die größer sind als ihre Vorgänger. Der resultierende Spaltenvektor sollte wie folgt lauten:

0,1,2,3,0,1,2,3,4,5,6,0,1,0

Mein Versuch ist es, eine "Flag" -Spalte von Diffs zu erstellen, um zu markieren, wenn die Werte größer sind.

df$flag <- c(0,diff(df$a)>0)
> df$flag
 [1] 0 1 1 1 0 1 1 1 1 1 1 0 1 0

Dann kann ich ein bisschen Gruppen- / Summenmagie anwenden, um fast die richtige Antwort zu erhalten, außer dass die Summe nicht zurückgesetzt wird, wenn flag == 0:

df %>% group_by(flag) %>% mutate(run=cumsum(flag))

    a flag run
1   1    0   0
2   2    1   1
3   3    1   2
4   4    1   3
5   2    0   0
6   3    1   4
7   4    1   5
8   5    1   6
9   8    1   7
10  9    1   8
11 10    1   9
12  1    0   0
13  2    1  10
14  1    0   0

Ich möchte nicht auf eine for () -Schleife zurückgreifen müssen, da ich mehrere dieser laufenden Summen für die Berechnung mit mehreren hunderttausend Zeilen in einem data.frame habe.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage