考虑关注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
希望有人可以帮助我。
答案 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