У меня есть набор данных с начальным и конечным временем для событий (называемый df_time) и другой набор данных, когда произошло событие (df_val). Я хочу выполнить внутреннее объединение двух фреймов данных о том, имело ли место df_val в двух столбцах df_time.
start = c(1, 5, 7, 4)
end = c(2, 7, 11, 7)
event_id = c('a', 'b', 'c', 'd')
df_time = data.frame(start, end, event_id)
time = c(3, 6, 2, 10, 11)
val = c(100, 20, 30, 40, 50)
df_val = data.frame(time, val)
Мне известно о map2_dfr, и я использую его как таковой:
library(tidyverse)
unique( map2_dfr( df_time$start, df_time$end,
~filter(df_val, time >= .x, time <= .y) ) )
Однако это возвращает мне только столбцы в df_val;есть ли способ вернуть столбцы из df_time для вывода вроде:
time val start end event_id
1 2 30 1 2 'a'
2 6 20 5 7 'b'
3 10 40 7 11 'c'
4 6 50 4 7 'd'
Редактировать: setDT очень близок к правильному ответу! Тем не менее, df_time имеет значения для val и время для строк, которые не имеют соответствующих значений в df_val, вместо того, чтобы быть полностью опущенными. Например, учитывая приведенный ниже случай 2:
Case 2
time=c(3,6,10,11)
val=c(100,20,40,50)
df_val=data.frame(time,val)
start = c(1, 5, 7, 4)
end = c(2, 7, 11, 7)
event_id = c('a', 'b', 'c', 'd')
df_time = data.frame(start, end, event_id)
setDT(df_time)[df_val, c("val", "time") := .(val, time) ,
on = .(start <= time, end >= time)]
df_time
Вывод:
df_time
start end event_id val time
1 2 a NA NA
5 7 b 20 6
7 11 c 50 11
4 7 d 20 6
Ожидаемый / правильный вывод:
start end event_id val time
5 7 b 20 6
7 11 c 50 11
4 7 d 20 6