使用R

时间:2018-07-23 20:02:53

标签: r

我有一个向量,该向量具有将唯一事件的开始和结束标志标记为一个因素,编码为“开始”和“结束”。包含在“开始”和“结束”之间的索引被视为事件的一部分。因此,我想用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)

如果可以帮助或简化事情,则事件的顺序将严格按照顺序递增。

1 个答案:

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