将2个数据框与df.x中的dateTime列连接到df.y中的dateStart dateEnd过滤掉?

时间:2019-10-02 19:22:48

标签: r tidyverse

我有一个数据集,其中包含事件的开始和结束时间(称为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

1 个答案:

答案 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