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
的等价物吗?或者用dplyr
创建rleid
行为的“最佳”方法是执行类似以下的操作
library(dplyr)
my_rleid = rep(seq_along(rle(df$grp)$values), times = rle(df$grp)$lengths)
df %>%
mutate(rleid = my_rleid)
6条答案
按热度按时间sr4lhrrt1#
您可以执行以下操作(当同时加载data.table和dplyr时):
这给出:
如果你不想单独加载data.table,你也可以使用(@DavidArenburg在评论中提到):
正如@RichardScriven在评论中所说,你可以复制/窃取它:
wtzytmuj2#
如果只想使用base R和dplyr,更好的方法是将自己的一行或两行版本的
rleid()
Package 为函数,然后在需要时应用它。n3h0vuf23#
您可以使用
dplyr
中的lag
函数来执行此操作。给予
juzqafwq4#
业务方案所用办法的简化(不涉及额外的一揽子办法)可以是:
或者:
wfveoks05#
从
v1.1.0
dplyr添加了根据data.table::rleid()
建模的函数consecutive_id()
,具有相同的多个向量支持和NA
值处理。ws51t4hk6#
这里有很多非常好的解决方案,但是我想指出的是,当数据具有
NAs
时,有些解决方案不会给出与data.table::rleid()
相同的结果。请记住,每次发生变化时,data.table::rleid()
都会递增,包括NAs
。例如,Alex的解决方案非常适合OP,但在处理
NAs
时,不能给出与data.table::rleid()
相同的结果:下面是一个易于阅读和理解的
tidyverse
(虽然速度较慢)等效于data.table::rleid()
:下面是一个易于阅读和理解的
tidyverse
等效于data.table::rleid()
,但忽略了NAs
:创建于2022年8月27日,使用reprex v2.0.2