我有一个包含事件开始和结束时间的数据集(称为 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 值和 time 的 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
一个选项是非对等加入data.table
。将 'data.frame' 转换为 'data.table' ( setDT(df_time)
),加入 'df_val'on
非等值 ( <=
, >=
) 列,并分配 ( :=
) 与 ' 中的新列匹配的相应 'val' 和 'time' df_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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句