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

时间:2015-11-27 09:34:00

标签: 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   Yes    
   9   Yes
  10    No

我想要一个额外的列来计算“值”已连续“是”的次数。因此,当Value为'No'时,新变量应始终为0.如果是'No'之后第一次出现'Yes',则设置为1.如果那么下一个观察结果也是肯定的,它应该是2一旦“是”链断断续续,下一个“是”的新变量将再次为1。所以我的数据框应如下所示:

Day Value Count
 1   Yes  1
 2    No  0
 3   Yes  1  
 4   Yes  2
 5   Yes  3
 6    No  0
 7    No  0
 8   Yes  1
 9   Yes  2
10    No  0 

希望有人可以帮助我。

2 个答案:

答案 0 :(得分:4)

您可以尝试使用“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

答案 1 :(得分:3)

我们也可以使用base R。我们通过比较&#39; Value&#39;的相邻元素来创建分组变量(&#39; grp&#39;)。列和cumsum逻辑索引。然后,可以在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