向后查找最近的日期,并查看特定日期列的日期

时间:2017-10-30 09:08:33

标签: mysql sql r dplyr

我的数据集中有三列:

  1. 购买商品X的日期
  2. 购买物品Y的日期
  3. 购买商品Z的日期
  4. 示例数据:

     set.seed(100)
     Y   <- sample(seq(as.Date('2016-01-01'), as.Date('2017-09-30'), by="day"), 100)
     Y1  <- sample(seq(as.Date('2016-01-01'), as.Date('2017-03-31'), by="day"), 100)
     Y2  <- sample(seq(as.Date('2016-01-01'), as.Date('2017-03-31'), by="day"), 100)
     X1 <- sample(1:183, 100, replace = T)
     Z1 <- sample(1:183, 100, replace = T)
    
     X  <- Y1 - X1
     Z  <- Y2 + Z1
    
     dat <- data.frame("X"=X, "Y"=Y, "Z"=Z)
    

    我想要做的是创建一个数据集:

    1. 如果购买了Y,请在6个月内回顾一下,找到购买了X的最近日期的所有行。此外,从Y购买日期开始,并在购买Z时找到所有最近日期
    2. 如果任何日期在6个月范围内不可用,请选择为NA
    3. 因此示例输出看起来像:

       2017-04-10 2017-05-08  2017-06-19
       2017-01-01 2017-05-08  2017-09-30
       .
       .
       .
       2017-04-10 2017-06-10  2016-06-19
       NA         2017-05-08  2017-09-30
       .
       .
       .
      

      这里,最近的日期意味着(例如): 如果在2017年6月30日的日期购买Y,那么从6月30日开始购买X的最近日期(比如说是2017年5月15日)和购买Z的最近日期(让我们坐的是7月21日, 2017年)。所以对于X,它应该在6个月内向后看,对于Z,ti应该向前看6个月。

      逻辑很简单,但如果可能的话,我宁愿在r-SQL或dplyr中找到出路。

1 个答案:

答案 0 :(得分:1)

library(dplyr)


# repeat all x and z dates per y
bind_cols(
    select(dat, Y) %>% slice(rep(row_number(), n())),
    select(dat, -Y) %>% slice(rep(row_number(), each = n()))) %>% 
  distinct() %>%
  # calculate date differences and keep if within 6 month bounds
  mutate(XYdiff = as.numeric(difftime(X, Y, units = "days")),
         ZYdiff = as.numeric(difftime(Z, Y, units = "days"))) %>%
  mutate(X = if_else(between(XYdiff, -180, 0), X, as.Date(NA)),
         Z = if_else(between(ZYdiff, 0, 180), Z, as.Date(NA))) %>% 
  # for each y, get the closest dates
  group_by(Y) %>%
  summarise(X = max(X, na.rm = TRUE),
            Z = min(Z, na.rm = TRUE)) %>% 
  # add in any Y with NA for both X and Z
  tidyr::complete(Y, fill = list(X = NA, Y = NA))