如何使用过滤器在 R 中制作纪元

How to make epochs in R using filter

我有一个大型数据框,我想在其中从另一列中的值开始对数据进行子集化,从而增加一定的时间。为了更清楚,数据框看起来像这样:

df <- data.frame(TimeStamp = c(100, 150, 200, 250, 300, 350, 400, 450, 500, 550), 
             Marker = c("start_trial", "", "", "", "", "start_trial", "", "", "", ""), 
             size=c(3, 5, 1, 5, 4, 6 , 9, 2, 4, 8),
             trial=c("trial 1", "trial 1", "trial 1", "trial 1", "trial 1", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2"))

   TimeStamp      Marker size   trial
1        100 start_trial    3 trial 1
2        150                5 trial 1
3        200                1 trial 1
4        250                5 trial 1
5        300                4 trial 1
6        350 start_trial    6 trial 2
7        400                9 trial 2
8        450                2 trial 2
9        500                4 trial 2
10       550                8 trial 2

我想要做的是保留从与每个开始试验值相关联的时间戳值开始的 100 到 150 毫秒之间的行,从而形成纪元。所以,在这个例子中,我希望我的数据像这样结束:

df2 <- data.frame(TimeStamp = c(200, 250, 450, 500), Marker = c("", "", "", ""), size=c(1, 5, 2, 4), trial=c("trial 1", "trial 1", "trial 2", "trial 2"))

  TimeStamp Marker size   trial
1       200           1 trial 1
2       250           5 trial 1
3       450           2 trial 2
4       500           4 trial 2

我的实际数据有将近一百万行,其中有数千个这样的“开始试验”,并且 TimeStamp 值没有整齐地划分为 50 毫秒的时间段。

希望有人能帮帮我。提前致谢!

通过累加逻辑表达式 ('grp') 和 filter 那些 'Timestamp' 与 first 元素之差的行来创建一个组between 100 和 150

library(dplyr)
df %>%
   group_by(grp = cumsum(Marker == 'start_trial')) %>% 
   filter(between(TimeStamp - first(TimeStamp), 100, 150) ) %>%
   ungroup %>%
   select(-grp)

-输出

# A tibble: 4 x 4
#  TimeStamp Marker  size trial  
#      <dbl> <chr>  <dbl> <chr>  
#1       200 ""         1 trial 1
#2       250 ""         5 trial 1
#3       450 ""         2 trial 2
#4       500 ""         4 trial 2