R 根据不同数据帧中的多个条件筛选数据帧

R 根据不同数据帧中的多个条件筛选数据帧,r,dplyr,R,Dplyr,我想根据不同数据帧('key')中的多个值筛选一个数据帧('data') 我的'key'看起来像这样 exhibit.name <- c("lions", "otters", "penguins") exhibit.start <- c(as.Date("2016-04-01"), as.Date("2016-05-01"), as.Date("2016-06-01")) exhibit.end <- c(as.Date("2016-04-30"), as.Date("2

我想根据不同数据帧(
'key'
)中的多个值筛选一个数据帧(
'data'

我的
'key'
看起来像这样

exhibit.name  <- c("lions", "otters", "penguins")
exhibit.start <- c(as.Date("2016-04-01"), as.Date("2016-05-01"), as.Date("2016-06-01"))
exhibit.end   <- c(as.Date("2016-04-30"), as.Date("2016-05-31"), as.Date("2016-06-30"))
key           <- data_frame(exhibit.name, exhibit.start, exhibit.end)
exhibit.name <- c("lions", "lions", "otters", 
                  "otters", "penguins", "penguins")
exhibit.date <- c(as.Date("2016-04-15"), as.Date("2016-12-15"), as.Date("2016-05-15"),
                  as.Date("2016-02-15"), as.Date("2016-06-15"), as.Date("2016-10-15"))
data         <- data_frame(exhibit.name, exhibit.date)
我需要筛选
'data'
以返回
数据$exhibit.name
匹配
键$exhibit.name
的行,以及其
数据$exhibit.date
在相关
键$exhibit.start
键$exhibit.end
日期内的行。生成的数据帧如下所示:

> valid.exhibits
1|lions   |2016-04-15
2|otters  |2016-05-15
3|penguins|2016-06-15

谢谢

我们可以做一个
left\u-join
然后
filter

data %>% 
   left_join(., key) %>%
   filter(exhibit.start < exhibit.date, exhibit.end  > exhibit.date)  %>% 
   select(1:2)
#     exhibit.name exhibit.date
#         <chr>       <date>
#1        lions   2016-04-15
#2       otters   2016-05-15
#3     penguins   2016-06-15
数据%>%
左联合(,键)%>%
过滤器(exhibit.startexhibit.date)%>%
选择(1:2)
#附件名称附件日期
#                
#1狮子会2016-04-15
#两只水獭2016-05-15
#3只企鹅2016-06-15

我们还可以使用非equi(来自data.table开发版本的条件联接),即v1.9.7+

library(data.table)
setDT(key)
setDT(data)[key, on = .(exhibit.name, exhibit.date > exhibit.start, 
          exhibit.date < exhibit.end), new := 1]
na.omit(data)[, new := NULL][]
#   exhibit.name exhibit.date
#1:        lions   2016-04-15
#2:       otters   2016-05-15
#3:     penguins   2016-06-15
库(data.table)
setDT(键)
setDT(数据)[key,on=(exhibit.name,exhibit.date>exhibit.start,
附件日期<附件结束),新:=1]
na.省略(数据)[,新:=NULL][]
#附件名称附件日期
#1:狮子会2016-04-15
#2:水獭2016-05-15
#3:企鹅队2016-06-15

Fyi,您可以
as.Date(c(chars,chars,chars))
dplyr中有一个
between
函数