我的数据集中有三列:
示例数据:
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)
我想要做的是创建一个数据集:
因此示例输出看起来像:
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中找到出路。
答案 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))