Gibt es ein dplyr-Äquivalent zu data.table :: rleid?

data.table bietet eine nette Komfortfunktion, rleid für Run-Length-Encoding:

 library(data.table) DT = data.table(grp=rep(c("A", "B", "C", "A", "B"), c(2, 2, 3, 1, 2)), value=1:10) rleid(DT$grp) # [1] 1 1 2 2 3 3 3 4 5 5 

Ich kann das in Base R nachahmen mit:

 df <- data.frame(DT) rep(seq_along(rle(df$grp)$values), times = rle(df$grp)$lengths) # [1] 1 1 2 2 3 3 3 4 5 5 

Kennt irgendjemand ein dplyr Äquivalent (?) Oder ist der “beste” Weg, das rleid Verhalten mit dplyr zu erzeugen, etwas wie das Folgende zu tun

 library(dplyr) my_rleid = rep(seq_along(rle(df$grp)$values), times = rle(df$grp)$lengths) df %>% mutate(rleid = my_rleid) 

    Sie können es einfach tun (wenn Sie sowohl data.table als auch dplyr geladen haben):

     DT < - DT %>% mutate(rlid = rleid(grp)) 

    das gibt:

     > DT grp value rlid 1: A 1 1 2: A 2 1 3: B 3 2 4: B 4 2 5: C 5 3 6: C 6 3 7: C 7 3 8: A 8 4 9: B 9 5 10: B 10 5 

    Wenn Sie die data.table nicht separat laden wollen, können Sie auch (wie von @DavidArenburg in den Kommentaren erwähnt) Folgendes verwenden:

     DT < - DT %>% mutate(rlid = data.table::rleid(grp)) 

    Und wie @RichardScriven in seinem Kommentar sagte, kannst du es einfach kopieren / stehlen:

     myrleid < - data.table::rleid 

    Wenn Sie nur Basis-R und dplyr verwenden möchten , ist der bessere Weg, Ihre eigene ein- oder zweizeilige Version von rleid() als eine function rleid() und dann anzuwenden, wann immer Sie sie brauchen.

     library(dplyr) myrleid < - function(x) { x <- rle(x)$lengths rep(seq_along(x), times=x) } ## Try it out DT <- DT %>% mutate(rlid = myrleid(grp)) DT # grp value rlid # 1: A 1 1 # 2: A 2 1 # 3: B 3 2 # 4: B 4 2 # 5: C 5 3 # 6: C 6 3 # 7: C 7 3 # 8: A 8 4 # 9: B 9 5 #10: B 10 5 

    Sie können dies mit der lag von dplyr .

     DT < - DT %>% mutate(rleid = (grp != lag(grp, 1, default = "asdf"))) %>% mutate(rleid = cumsum(rleid)) 

    gibt

     > DT grp value rleid 1: A 1 1 2: A 2 1 3: B 3 2 4: B 4 2 5: C 5 3 6: C 6 3 7: C 7 3 8: A 8 4 9: B 9 5 10: B 10 5