data.table提供了一個很好的方便功能,rleid用于游程編碼: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我可以在基地模仿這個R有: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有沒有人知道dplyr等價物(?)或者是創建rleid行為與dplyr是執行如下操作library(dplyr)my_rleid = rep(seq_along(rle(df$grp)$values), times = rle(df$grp)$lengths)df %>%
mutate(rleid = my_rleid)
3 回答

HUWWW
TA貢獻1874條經驗 獲得超12個贊
DT <- DT %>% mutate(rlid = rleid(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 510: B 10 5
DT <- DT %>% mutate(rlid = data.table::rleid(grp))
myrleid <- data.table::rleid

慕斯709654
TA貢獻1840條經驗 獲得超5個贊
如果你只想用R和dplyr,更好的方法是將您自己的一兩行版本的rleid()作為一個函數,然后在需要的時候應用它。
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

飲歌長嘯
TA貢獻1951條經驗 獲得超3個贊
lag
dplyr
.
DT <- DT %>% mutate(rleid = (grp != lag(grp, 1, default = "asdf"))) %>% mutate(rleid = cumsum(rleid))
> 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 510: B 10 5
- 3 回答
- 0 關注
- 605 瀏覽
添加回答
舉報
0/150
提交
取消