计数变量在R中连续重复的次数
考虑以下MWE:计数变量在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
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