我想为一个TRUE或FALSE值列分配一个序列,该序列在一个或多个连续的FALSE值之后保持TRUE的相同值。
即我要复制的内容是;
df <- data.frame(
new_activity = as.character(c("TRUE","TRUE","TRUE","FALSE","TRUE","TRUE","TRUE","TRUE","TRUE","TRUE",
"TRUE","TRUE","TRUE","TRUE","FALSE","FALSE","TRUE","TRUE","FALSE","TRUE")),
sequence = as.numeric(c(1,2,3,4,4,5,6,7,8,9,10,11,12,13,14,14,14,15,16,16)))
答案 0 :(得分:3)
将您的列转换为logical
,先使用cumsum
,然后加上输入向量的负数以获得所需的输出
x <- as.logical(df$new_activity)
cumsum(x) + !x
# [1] 1 2 3 4 4 5 6 7 8 9 10 11 12 13 14 14 14 15 16 16
答案 1 :(得分:0)
一种选择是将'new_activity'转换为logical
,将其放置在i
上,创建列'sequence1'作为行序列,然后在NAs
上填充na.locf
library(zoo)
library(data.table)
setDT(df)[as.logical(new_activity), sequence1 := seq_len(.N)
][, sequence1 := na.locf(sequence1, fromLast = TRUE)]
df
# new_activity sequence sequence1
# 1: TRUE 1 1
# 2: TRUE 2 2
# 3: TRUE 3 3
# 4: FALSE 4 4
# 5: TRUE 4 4
# 6: TRUE 5 5
# 7: TRUE 6 6
# 8: TRUE 7 7
# 9: TRUE 8 8
#10: TRUE 9 9
#11: TRUE 10 10
#12: TRUE 11 11
#13: TRUE 12 12
#14: TRUE 13 13
#15: FALSE 14 14
#16: FALSE 14 14
#17: TRUE 14 14
#18: TRUE 15 15
#19: FALSE 16 16
#20: TRUE 16 16