我正在尝试从日历日期数据框中过滤具有特定offsetdate值的日期。
数据框日历日:
calendardays <- as.data.frame(as.Date(seq(as.Date("2019-01-03"), as.Date("2022-12-31"), by="days")))
colnames(calendardays)<- c("Date")
DF2:
LC Custcode Date offsetdate
RM11 IN007543 2019-10-03 2
WK15 IN007543 2019-10-03 3
在DF2中,每行都有一个offsetdate,这意味着我想找到x no。从DF2中提到的日期开始的日期对应于Dataframe日历日的LC CustCode。
输出:
LC Custcode Date
RM11 IN007543 2019-10-03
RM11 IN007543 2019-10-04
WK15 IN007543 2019-10-03
WK15 IN007543 2019-10-04
WK15 IN007543 2019-10-05
答案 0 :(得分:3)
使用ix扩展DF2,然后递增“日期”字段。不使用任何软件包。
ix <- rep(1:nrow(DF2), DF2$offsetdate) # 1,1,2,2,2
DF2rep <- transform(DF2[ix, ], Date = Date + sequence(DF2$offsetdate) - 1)[-4]
这已经提供了问题中显示的输出,但是如果您需要检查日期是否也出现在日历日中,则只会将日期也保留在DF2rep中。
DF2rep[DF2rep$Date %in% calendardays$Date, ]
可复制形式的DF2假定为:
Lines <- " LC Custcode Date offsetdate
RM11 IN007543 2019-10-03 2
WK15 IN007543 2019-10-03 3"
DF2 <- read.table(text = Lines, header = TRUE)
DF2$Date <- as.Date(DF2$Date)
答案 1 :(得分:1)
我们为什么需要calendardays
?我们可以使用DF2
tidyverse
library(tidyverse)
DF2 %>%
mutate(Date = as.Date(Date),
seq_day = map2(Date, Date + offsetdate, seq, by = "1 day")) %>%
unnest(seq_day) %>%
select(-Date, -offsetdate)
# LC Custcode seq_day
# <fct> <fct> <date>
#1 RM11 IN007543 2019-10-03
#2 RM11 IN007543 2019-10-04
#3 RM11 IN007543 2019-10-05
#4 WK15 IN007543 2019-10-03
#5 WK15 IN007543 2019-10-04
#6 WK15 IN007543 2019-10-05
#7 WK15 IN007543 2019-10-06