2016-08-08 19 views
1
df <- data.frame(mark_new =c(1,0,0,1,0,0,0,0,0,1,0,1)) 
> df 
    mark_new 
1   1 
2   0 
3   0 
4   1 
5   0 
6   0 
7   0 
8   0 
9   0 
10  1 
11  0 
12  1 

Jedes Mal, wenn eine 1 angezeigt wird, bedeutet dies, dass eine neue Sitzung gestartet wird. Ich möchte jeder Sitzung eine ID geben. Das Ergebnis sollte wie folgt aussehen:ID an Sitzungen mit einer Markierung in der ersten Zeile einer neuen Sitzung geben

>df1 
    mark_new id 
1   1 1 
2   0 1 
3   0 1 
4   1 2 
5   0 2 
6   0 2 
7   0 2 
8   0 2 
9   0 2 
10  1 3 
11  0 3 
12  1 4 

Antwort

0

Wir cumsum auf der logischen Spalte verwenden können (df$mark_new == 1 - hier gehe ich davon aus, dass es andere Werte zusätzlich zu 0 sein könnte und 1)

df$id <- cumsum(df$mark_new==1) 
df$id 
#[1] 1 1 1 2 2 2 2 2 2 3 3 4 

Wenn die ‚mark_new‘ Spalte ist binär, wie @thelatemail erwähnt, können wir nur die cumsum auf die gesamte Spalte tun, anstatt auf ‚logisch‘ der Umwandlung

df$id <- cumsum(df$mark_new) 

Wenn wir dplyr

library(dplyr) 
df %>% 
    mutate(id = cumsum(mark_new == 1) 
+0

gerade 'cumsum (df $ mark_new) verwenden' tun es – thelatemail

+0

@thelatemail Ja, nur für den Fall der OP andere Werte haben. – akrun