计数变量在R中连续重复的次数

计数变量在R中连续重复的次数,r,R,考虑以下MWE: df <- data.frame(Day=1:10, Value = c("Yes","No","Yes", "Yes", "Yes", "No", "No", "Yes","Yes", "No")) Day Value 1 Yes 2 No 3 Yes 4 Yes 5 Yes 6 No 7 No 8 Ye

考虑以下MWE:

df <- data.frame(Day=1:10, Value = c("Yes","No","Yes", "Yes", "Yes", 
                                     "No", "No", "Yes","Yes",  "No"))

 Day Value
   1   Yes
   2    No
   3   Yes
   4   Yes
   5   Yes
   6    No
   7    No
   8   Yes    
   9   Yes
  10    No
希望有人能帮助我。

您可以尝试使用“data.table”,特别是
rleid
函数:

例如:

library(data.table)
as.data.table(df)[, count := sequence(.N), by = rleid(Value)][Value == "No", count := 0][]
#     Day Value count
#  1:   1   Yes     1
#  2:   2    No     0
#  3:   3   Yes     1
#  4:   4   Yes     2
#  5:   5   Yes     3
#  6:   6    No     0
#  7:   7    No     0
#  8:   8   Yes     1
#  9:   9   Yes     2
# 10:  10    No     0

我们也可以使用
base R
。我们通过比较“Value”列的相邻元素和逻辑索引
cumsum
来创建一个分组变量(“grp”)。然后,可以在
ave
中使用它来创建序列

grp <- with(df, cumsum(c(TRUE,Value[-1L]!=Value[-length(Value)])))
df$count <- ave(seq_along(df$Value), grp, FUN=seq_along)*(df$Value=='Yes')
df$count
#[1] 1 0 1 2 3 0 0 1 2 0

grp智能+1但我猜应该把
值[1]!=值[2]
而不是
grp
中的第一个
TRUE
,这会使它更通用。@stasg我想你是说回收,对吧?谢谢
grp <- with(df, cumsum(c(TRUE,Value[-1L]!=Value[-length(Value)])))
df$count <- ave(seq_along(df$Value), grp, FUN=seq_along)*(df$Value=='Yes')
df$count
#[1] 1 0 1 2 3 0 0 1 2 0