如果日期介于两个日期之间,请使用共享参考查找值

时间:2018-06-08 00:24:43

标签: r dplyr

我是R的新手并且很难有所作为。我有一个数据框,其中包含日期和广告位置的名称。

我有另一个表格,其中包含开始日期,结束日期,广告展示位置的名称和费率。

我基本上需要引用rate键并根据日期和位置名称将vlookup(left_join)应用于我的数据框,考虑到我的引用表中diff日期范围可能出现的不同速率。

到目前为止,我一直在使用dplyr进行广泛的移动,但这是迄今为止我遇到过的最困难的事情。最初的想法是,我可能需要将每个可能的日期范围设置为自己的表并将left_join应用于df,但我不确定。

示例:

参考表

placement             start        end          rate 
NewYorkTimes_iPhone   2018-06-01   2018-06-25   5 
NewYorkTimes_iPhone   2018-06-26   2018-06-30   7 

期望的结果

placement           date        rate 
NewYorkTimes_iPhone 2018-06-15  5 

基本上在数据框中,费率列将丢失。我需要它来搜索参考表以查找共享位置,并查看日期是否在密钥

中的范围之间

任何帮助表示赞赏!这是我的第一个项目,我通过DataCamp在线学习了一切。

谢谢!

泰勒

1 个答案:

答案 0 :(得分:0)

> ref_tbl <- 
+     tibble(
+         placement = c("NewYorkTimes_iPhone","NewYorkTimes_iPhone"), 
+         start = c("2018-06-01","2018-06-26"),
+         end = c("2018-06-25","2018-06-30"),
+         rate = c(5,7)
+     ) %>% 
+     mutate_at(vars(start, end),as.Date)
> des_tbl <- 
+     tibble(
+         placement = "NewYorkTimes_iPhone",
+         date = "2018-06-15",
+         rate = 5
+     ) %>% 
+     mutate(date = as.Date(date))
> ref_tbl
# A tibble: 2 x 4
  placement           start      end         rate
  <chr>               <date>     <date>     <dbl>
1 NewYorkTimes_iPhone 2018-06-01 2018-06-25     5
2 NewYorkTimes_iPhone 2018-06-26 2018-06-30     7
> des_tbl
# A tibble: 1 x 3
  placement           date        rate
  <chr>               <date>     <dbl>
1 NewYorkTimes_iPhone 2018-06-15     5
> 
> ref_tbl %>% 
+     left_join(des_tbl, by = c("placement","rate")) %>% 
+     mutate(
+         ifelse(date %within% interval(start,end),1,0)
+     )
# A tibble: 2 x 6
  placement           start      end         rate date       `ifelse(date %wit~
  <chr>               <date>     <date>     <dbl> <date>                  <dbl>
1 NewYorkTimes_iPhone 2018-06-01 2018-06-25     5 2018-06-15                  1
2 NewYorkTimes_iPhone 2018-06-26 2018-06-30     7 NA                         NA
> 

以下是一些评论。

对于左连接表,我们需要获得date介于startend之间的结果。 这里来自%within%包的函数intervallubridate是一个解决方案。