我有一个数据集,其中包含事件的开始和结束时间(称为df_time),另一个数据集具有事件发生的时间(df_val)。我想对df_val是否在df_time的2列内发生两个数据帧进行内部联接。
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的na值和df_val中没有相应值的行的time值,而不是被完全省略。例如,将以下情况视为情况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
答案 0 :(得分:1)
一个选项是data.table
中的非等额联接。将'data.frame'转换为'data.table'(setDT(df_time)
),并与'df_val'on
非等式(<=
,>=
)列连接,然后分配(:=
)与“ df_time”中新列相匹配的“ val”和“ time”
library(data.table)
na.omit(setDT(df_time)[df_val, c("val", "time") := .(val, time) ,
on = .(start <= time, end >= time)])
#. start end event_id val time
#1: 5 7 b 20 6
#2: 7 11 c 50 11
#3: 4 7 d 20 6