根据第二列以连续顺序分配值

时间:2019-02-12 10:46:57

标签: r

我想为一个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)))

2 个答案:

答案 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