【问题标题】:If date is between two dates, find value using shared reference如果日期在两个日期之间,则使用共享参考查找值
【发布时间】:2018-06-08 00:24:42
【问题描述】:

我是 R 的新手,在某些事情上遇到了困难。我有一个数据框,其中包含日期和广告展示位置的名称等内容。

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

考虑到我的参考表中不同日期范围可能出现的不同费率,我基本上需要参考费率键并根据日期和展示位置名称对我的数据框应用 vlookup (left_join)。

到目前为止,我一直在广泛使用 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 

基本上,在数据框中,速率列会丢失。我需要它来搜索共享位置的参考表,并查看日期是否在键中的范围之间

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

谢谢!!

泰勒

【问题讨论】:

  • 你能提供一些示例数据,以及预期输出的示例吗?
  • @jdobres 编辑以提供示例数据
  • @lmo 以前这样做是因为我认为将来会需要它。谢谢
  • @Tyler 很好。感谢您更新您的问题以提供这些重要信息。
  • dat$rate[dat1$date>=dat$start&dat1$date<=dat$end] 或者你可以做dat$rate[data,table::between(dat1$date,dat$start,dat$end)]

标签: r dplyr


【解决方案1】:
> 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
> 

这里有一些cmets。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多