按特定列值过滤日期

时间:2019-10-05 15:41:03

标签: r

我正在尝试从日历日期数据框中过滤具有特定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  

2 个答案:

答案 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