Filtering a data frame by several criteria from different data frames

I would like to filter out one data frame ( 'data') based on several values ​​in another data frame ( 'key').

My 'key'looks like this

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)

And mine 'data'looks like this

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)

I need to filter 'data'to return the rows where data$exhibit.namematches key$exhibit.nameAND whose data$exhibit.dategets on the corresponding date key$exhibit.startand key$exhibit.end. The resulting data frame will look like this:

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

Thank!

+4
source share
1 answer

We can do left_joinand thenfilter

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

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
+4

Source: https://habr.com/ru/post/1652904/


All Articles