R 为值列中的每次更改递增 1 并重新启动计数器

  • 本文关键字:计数器 重新启动 r
  • 更新时间 :
  • 英文 :


我想找到一种方法来做与这个问题非常相似的工作。 列中每更改一次,递增 1

但是我想在 var1 = c 使用df$var2 <- with(rle(as.character(df$var1)), rep(seq_along(values), lengths))*

列变量 2 中的结果

var1 var2 Should be
a    1   1
a    1   1
1    2   2
0    3   3
b    4   4
b    4   4
b    4   4
c    5   1
1    6   2
1    6   2

data.table中,您可以使用rleid获取每个组中var1的运行长度 ID。

library(data.table)
setDT(df)
df[, var2 := rleid(var1), by = cumsum(var1 == "c")]
df
#    var1 var2
# 1:    a    1
# 2:    a    1
# 3:    1    2
# 4:    0    3
# 5:    b    4
# 6:    b    4
# 7:    b    4
# 8:    c    1
# 9:    1    2
#10:    1    2

并使用dplyr

library(dplyr)
df %>%
group_by(group = cumsum(var1 == "c")) %>%
mutate(var2 = cumsum(var1 != lag(var1, default = first(var1))) + 1)

数据

df <- structure(list(var1 = structure(c(3L, 3L, 2L, 1L, 4L, 4L, 4L, 
5L, 2L, 2L), .Label = c("0", "1", "a", "b", "c"), class = "factor")), 
class = "data.frame", row.names = c(NA, -10L))

我们可以将OP 的代码与rle一起使用,base Rave

df$var2 <- with(df,  as.integer(ave(as.character(var1), cumsum(var1 == 'c'), 
FUN = function(x) with(rle(x), rep(seq_along(values), lengths)))))
df$var2
#[1] 1 1 2 3 4 4 4 1 2 2

数据

df <- structure(list(var1 = structure(c(3L, 3L, 2L, 1L, 4L, 4L, 4L, 
5L, 2L, 2L), .Label = c("0", "1", "a", "b", "c"), class = "factor")), 
class = "data.frame", row.names = c(NA, 
-10L))

最新更新