我希望能够过滤所有的"B";在事件"0"之前5秒内发生的事件;A";。甚至不知道从哪里开始。这是一些样本数据。
set.seed(123)
event_df <- tibble(time_sec = c(1:120)) %>%
sample_n(50) %>%
arrange(time_sec) %>%
mutate(event = sample(c("A","B"),
size = 50,
replace = TRUE,
prob = c(0.1,0.9)))
预期产出将与一致
tribble(
~time_sec, ~event,
57, "B",
90, "B",
91, "B",
92, "B",
103, "B",
)
等等。
谢谢!
dplyr
的一个选项是根据"event"中"a"值的出现创建一个分组列,获取它的lag
,使每个块都有前面的"B"值和作为"a"的last
值,然后,我们通过取"time_sec"的差值来计算filter
,其中它是"A"(last
值(,并检查它是否小于或等于5
library(dplyr)
event_df %>%
group_by(grp = lag(cumsum(event == 'A'), default = 0)) %>%
filter((last(time_sec) - time_sec) <=5)
# A tibble: 14 x 3
# Groups: grp [6]
# time_sec event grp
# <int> <chr> <dbl>
# 1 57 B 0
# 2 60 A 0
# 3 90 B 1
# 4 91 B 1
# 5 92 B 1
# 6 93 A 1
# 7 96 B 2
# 8 98 B 2
# 9 99 A 2
#10 103 B 3
#11 107 A 3
#12 113 B 4
#13 115 A 4
#14 117 B 5
使用基R的一种方法是获得相应的time_sec
值,其中event == 'A'
和event_df
仅选择time_sec
小于5秒的行。
A_event <- event_df$time_sec[event_df$event == 'A']
subset(event_df, time_sec %in% c(sapply(A_event, `-`, 1:5)) & event == 'B')
# time_sec event
# <int> <chr>
#1 57 B
#2 90 B
#3 91 B
#4 92 B
#5 96 B
#6 98 B
#7 103 B
#8 113 B