如何将给定年月中特定工作日的所有案例行绑定到 R 数据集中

How to row bind all cases of a particular weekday in a given year-month into an R dataset

我有包含日期​​和星期几的数据。

示例数据:

(1) alldays -- 此数据包括相应年份的所有日期和工作日。

(2) dt1 -- 这是包含日期 Adate 和星期几 dow 的示例数据集,将用于识别 year/month/weekday 然后查看对于给定工作日的同一个月内的所有日期。例如 - 2017 年 7 月的所有星期四都需要绑定到原始数​​据的行。

library(data.table)
library(tidyverse)
library(lubridate)

alldays <- data.table (date = seq(as.Date("2010-01-01"),
                                  as.Date("2011-12-31"), by="days"))
alldays <- alldays %>%
  dplyr::mutate(year = lubridate::year(date), 
                month = lubridate::month(date), 
                day = lubridate::day(date),
                dow = weekdays(date))
setDT(alldays)
head(alldays)
        date year month day       dow
1 2010-01-01 2010     1   1    Friday
2 2010-01-02 2010     1   2  Saturday
3 2010-01-03 2010     1   3    Sunday
4 2010-01-04 2010     1   4    Monday
5 2010-01-05 2010     1   5   Tuesday
6 2010-01-06 2010     1   6 Wednesday

这是主要数据集的示例

id <- seq(1:2)
admit <- rep(1,2)
zip <- c(54123, 54789)
Adate <- as.Date(c("2010-07-15","2011-03-14"))
year <- c(2010, 2011)
month <- c(7,3)
day <- c(15,14)
dow <- c("Thursday","Monday")
dt1 <- data.table(id, admit, zip, Adate, year, month, day, dow)
dt1
#>    id admit   zip      Adate year month day      dow
#> 1:  1     1 54123 2010-07-15 2010     7  15 Thursday
#> 2:  2     1 54789 2011-03-14 2011     3  14   Monday

生成的数据集应该是:

   id admit   zip      Adate year month day      dow
1:  1     0 54123 2010-07-01 2010     7   1 Thursday
2:  1     0 54123 2010-07-08 2010     7   8 Thursday
3:  1     1 54123 2010-07-15 2010     7  15 Thursday
4:  1     0 54123 2010-07-22 2010     7  22 Thursday
5:  1     0 54123 2010-07-29 2010     7  29 Thursday
6:  2     0 54789 2011-03-07 2011     3   7   Monday
7:  2     1 54789 2011-03-14 2011     3  14   Monday
8:  2     0 54789 2011-03-21 2011     3  21   Monday
9:  2     0 54789 2011-03-28 2011     3  28   Monday

所以我们可以看到与 id=1 关联的第一个日期 dt1 2010-07-15,这是一个星期四,在一个月内,该月还有 4 个星期四被添加到数据集中.变量 admit 指示该行是原始行还是随后因匹配而添加的行。

我尝试先从 alldays 中选择与工作日相匹配的其他日期,但我 运行 遇到了如何在适当填充其他值的同时将这些日期行绑定回原始数据集的问题。最终我将 运行 在一个大约有 300,000 行的数据集上。

这里有一个选项:

alldays[dt1[, .(id, zip, admit=0L, year, month, dow)], 
    on=.(year, month, dow), allow.cartesian=TRUE][
        dt1, on=.(id, date=Adate), admit := i.admit][]

输出:

         date year month day      dow id   zip admit
1: 2010-07-01 2010     7   1 Thursday  1 54123     0
2: 2010-07-08 2010     7   8 Thursday  1 54123     0
3: 2010-07-15 2010     7  15 Thursday  1 54123     1
4: 2010-07-22 2010     7  22 Thursday  1 54123     0
5: 2010-07-29 2010     7  29 Thursday  1 54123     0
6: 2011-03-07 2011     3   7   Monday  2 54789     0
7: 2011-03-14 2011     3  14   Monday  2 54789     1
8: 2011-03-21 2011     3  21   Monday  2 54789     0
9: 2011-03-28 2011     3  28   Monday  2 54789     0