我认为在 dplyr 中执行此操作可能更难,因为它实际上是基本 R 中的单线。让我们采用您的设置的玩具版本,其中包含一个间隔和一个只有两个日期列的迷你数据框:
library(lubridate)
interval <- interval(as.Date("2020-07-01"), as.Date("2020-07-04"))
df <- data.frame(id = 1:10,
col1 = seq(as.Date("2020-06-30"), by = "1 day", length.out = 10),
col2 = seq(as.Date("2020-06-25"), by = "1 day", length.out = 10))
df
#> id col1 col2
#> 1 1 2020-06-30 2020-06-25
#> 2 2 2020-07-01 2020-06-26
#> 3 3 2020-07-02 2020-06-27
#> 4 4 2020-07-03 2020-06-28
#> 5 5 2020-07-04 2020-06-29
#> 6 6 2020-07-05 2020-06-30
#> 7 7 2020-07-06 2020-07-01
#> 8 8 2020-07-07 2020-07-02
#> 9 9 2020-07-08 2020-07-03
#> 10 10 2020-07-09 2020-07-04
现在听起来好像您希望每个现有日期列都有一个逻辑列,指示其日期是否在时间间隔内。您可以像这样将这些列创建为新的数据框:
data.frame(t(apply(df[date_cols], 1, function(x) as.Date(x) %within% interval)))
#> X1 X2
#> 1 FALSE FALSE
#> 2 TRUE FALSE
#> 3 TRUE FALSE
#> 4 TRUE FALSE
#> 5 TRUE FALSE
#> 6 FALSE FALSE
#> 7 FALSE TRUE
#> 8 FALSE TRUE
#> 9 FALSE TRUE
#> 10 FALSE TRUE
因此,如果您想将列添加到数据框中,您可以执行以下操作:
df2 <- data.frame(t(apply(df[date_cols], 1, function(x) as.Date(x) %within% interval)))
df2 <- setNames(df2, paste0(date_cols, "_in_interval"))
cbind(df, df2)
#> id col1 col2 col1_in_interval col2_in_interval
#> 1 1 2020-06-30 2020-06-25 FALSE FALSE
#> 2 2 2020-07-01 2020-06-26 TRUE FALSE
#> 3 3 2020-07-02 2020-06-27 TRUE FALSE
#> 4 4 2020-07-03 2020-06-28 TRUE FALSE
#> 5 5 2020-07-04 2020-06-29 TRUE FALSE
#> 6 6 2020-07-05 2020-06-30 FALSE FALSE
#> 7 7 2020-07-06 2020-07-01 FALSE TRUE
#> 8 8 2020-07-07 2020-07-02 FALSE TRUE
#> 9 9 2020-07-08 2020-07-03 FALSE TRUE
#> 10 10 2020-07-09 2020-07-04 FALSE TRUE
或者,使用管道,您的解决方案将如下所示:
date_cols <- names(df[1:250])
df[date_cols] %>%
apply(1, function(x) as.Date(x) %within% interval) %>%
t() %>%
data.frame() %>%
setNames(paste0(date_cols, "_within_interval")) %>%
cbind(df, .)
由reprex package (v0.3.0) 于 2020 年 7 月 2 日创建