如何在满足条件之前根据先前行的迭代来选择行?

时间:2019-08-11 17:16:00

标签: r

我有两列的数据集:一列是事件类型,另一列是时间。

我想首先根据每次出现的事件'tr_start'创建一个列'trial_number'。从第一次出现“ tr_start”到第二次出现“ trial_number”应等于1。从第二次到第三次应为2,依此类推。

其次,我只想选择试用开始后的10秒钟('tr_start')。

time<- c(92, 96, 97, 100, 103, 104, 106, 111, 112, 115, 118, 119, 123)
event<- c('tr_start', 'on', 'off', 'on', 'off','on', 'off',
'left','on', 'off', 'tr_start', 'left', 'left')
data<- data.frame(time, event)

在此示例中,“ trial_number”列的第1至10行应为1,而第11至13行应为2。 其次,第一个“ tr_start”发生在第二个(时间)92。对于每个tr_start,我只需要保留在接下来的10s内进行的试验。在这种情况下,仅行1至4(最多102秒)和行11至13(每个'tr_start'之后的10s)。

谢谢!

1 个答案:

答案 0 :(得分:1)

我们可以使用cumsum

data$group  <- cumsum(data$event == 'tr_start')

然后我们可以基于“组”进行子集

subset(data, group ==1 & time <= (time[1] + 10))
#   time    event group
#1   92 tr_start     1
#2   96       on     1
#3   97      off     1
#4  100       on     1

如果需要为每个“组”完成

library(dplyr)
data %>%
   group_by(group = cumsum(event == "tr_start")) %>%
   filter(time <= (first(time) + 10))
# A tibble: 7 x 3
# Groups:   group [2]
#   time event    group
#  <dbl> <fct>    <int>
#1    92 tr_start     1
#2    96 on           1
#3    97 off          1
#4   100 on           1
#5   118 tr_start     2
#6   119 left         2
#7   123 left         2