如何将给定年月中特定工作日的所有案例行绑定到 R 数据集中
How to row bind all cases of a particular weekday in a given year-month into an R dataset
我有包含日期和星期几的数据。
- 我想识别与给定 year/month/weekday 匹配的特定工作日的所有实例
在原始数据中。
例如,如果第一条记录的日期为“2010-07-05”,这是星期四,我想对所有星期四进行 rowbind
发生在 2010 年 7 月的原始数据集。
- 在添加这些新行的同时,我还想用原始数据中除一列之外的所有列的值填充这些新行。异常是一个变量,它指示该行是否
是否在原始数据集中。
示例数据:
(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
我有包含日期和星期几的数据。
- 我想识别与给定 year/month/weekday 匹配的特定工作日的所有实例 在原始数据中。 例如,如果第一条记录的日期为“2010-07-05”,这是星期四,我想对所有星期四进行 rowbind 发生在 2010 年 7 月的原始数据集。
- 在添加这些新行的同时,我还想用原始数据中除一列之外的所有列的值填充这些新行。异常是一个变量,它指示该行是否 是否在原始数据集中。
示例数据:
(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