我有一个向量,该向量具有将唯一事件的开始和结束标志标记为一个因素,编码为“开始”和“结束”。包含在“开始”和“结束”之间的索引被视为事件的一部分。因此,我想用eventFlag
来表示是否正在发生一个事件,用eventIndex
来表示每个事件有一个递增的数目。
# what I have
eventPoints <- factor(c(NA,NA,NA,NA,"start",NA,NA,NA,NA,
"end",NA,NA,"start",NA,"end",NA,NA,"start","end",NA))
# what I want
eventFlag <-c(FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,
TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE,
TRUE,FALSE)
eventIndex <-c(0,0,0,0,1,1,1,1,1,1,0,0,2,2,2,0,0,3,3,0)
data.frame(eventPoints,eventFlag,eventIndex)
如果可以帮助或简化事情,则事件的顺序将严格按照顺序递增。
答案 0 :(得分:1)
我们根据'eventPoints'中'start','end'的对应出现来创建序列索引
s1 <- with(df1, unlist(Map(seq, which(eventPoints == "start"),
which(eventPoints == "end"))))
df1$eventFlag <- FALSE
df1$eventFlag[s1] <- TRUE
和'eventIndex'可以使用游程长度编码(rle
)
df1$eventIndex <- inverse.rle(within.list(rle(df1$eventFlag),
values[values] <- seq_along(values[values])))
df1
# eventPoints eventFlag eventIndex
#1 <NA> FALSE 0
#2 <NA> FALSE 0
#3 <NA> FALSE 0
#4 <NA> FALSE 0
#5 start TRUE 1
#6 <NA> TRUE 1
#7 <NA> TRUE 1
#8 <NA> TRUE 1
#9 <NA> TRUE 1
#10 end TRUE 1
#11 <NA> FALSE 0
#12 <NA> FALSE 0
#13 start TRUE 2
#14 <NA> TRUE 2
#15 end TRUE 2
#16 <NA> FALSE 0
#17 <NA> FALSE 0
#18 start TRUE 3
#19 end TRUE 3
#20 <NA> FALSE 0
df1 <- data.frame(eventPoints)