数据:
我有一个骰子的日期向量。
# A tibble: 10 x 1
Date
<dttm>
1 2017-04-04
2 2017-04-05
3 2017-04-07
4 2017-04-10
5 2017-04-11
6 2017-04-12
7 2017-04-13
8 2017-04-14
9 2017-04-17
10 2017-04-18
可重复使用:
structure(list(Date = structure(c(1491264000, 1491350400, 1491523200,
1491782400, 1491868800, 1491955200, 1492041600, 1492128000, 1492387200,
1492473600), class = c("POSIXct", "POSIXt"), tzone = "UTC")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -10L), .Names = "Date")
需要:
两个特征变量:
目的是确定我的响应变量是否依赖于Date
是否接近假日或长周末。例如,如果04-11是假日,我想要:
Date ProxNxtHol ProxPastHol
<dttm>
1 2017-04-04 4 32
2 2017-04-05 3 33
3 2017-04-07 2 34
4 2017-04-10 1 35
5 2017-04-11 0 36
6 2017-04-12 58 1
7 2017-04-13 57 2
8 2017-04-14 56 3
9 2017-04-17 55 4
10 2017-04-18 54 5
虽然我可以自己手动定义矢量中的所有假期并计算两个日期之间的差异,但这很麻烦,因为假期因全球位置而异。 (我有一个可以指示位置的变量。)
对于指定的区域,是否有预定义的函数可以指示给定日期是否为假日?
答案 0 :(得分:1)
我已经提出了这个for
循环来计算你想要的输出中显示的两个邻近度。请参阅以下步骤。
将您的结构转换为data frame
及其所有元素转换为类Date
> qdates <- data.frame(qdates)
> qdates$Date <- as.Date(qdates$Date)
> qdates
Date
1 2017-04-04
2 2017-04-05
3 2017-04-07
4 2017-04-10
5 2017-04-11
6 2017-04-12
7 2017-04-13
8 2017-04-14
9 2017-04-17
10 2017-04-18
使用library(timeDate)
建立data frame
美国假期。您可以在此处添加/修改日期,也可以使用其他可能包含联邦假期的内置功能。</ p>
> library(timeDate)
> hdates <- data.frame(Dates = c(USNewYearsDay(2017), USInaugurationDay(2017), USMLKingsBirthday(2017),
USLincolnsBirthday(2017), USWashingtonsBirthday(2017), USCPulaskisBirthday(2017),
USGoodFriday(2017), USMemorialDay(2017), USIndependenceDay(2017), USLaborDay(2017),
USColumbusDay(2017), USElectionDay(2017), USVeteransDay(2017), USThanksgivingDay(2017),
USChristmasDay(2017)))
> colnames(hdates) <- "HolidayDate"
> hdates$HolidayDate <- as.Date(hdates$HolidayDate)
> hdates
HolidayDate
1 2017-01-01
2 2017-01-20
3 2017-01-16
4 2017-02-12
5 2017-02-22
6 2017-03-06
7 2017-04-14
8 2017-05-29
9 2017-07-04
10 2017-09-04
11 2017-10-09
12 2017-11-07
13 2017-11-11
14 2017-11-23
15 2017-12-25
for
循环计算日期差异,并填充输出。
for(i in 1:nrow(qdates)) {
minDate <- max(hdates[which(hdates$HolidayDate <= qdates$Date[i]),])
maxDate <- min(hdates[which(hdates$HolidayDate >= qdates$Date[i]),])
qdates$ProxPastHol[i] <- abs(difftime(minDate, qdates$Date[i], units = "days"))
qdates$ProxNxtHol[i] <- abs(difftime(maxDate, qdates$Date[i], units = "days"))
}
> qdates
Date ProxPastHol ProxNxtHol
1 2017-04-04 29 10
2 2017-04-05 30 9
3 2017-04-07 32 7
4 2017-04-10 35 4
5 2017-04-11 36 3
6 2017-04-12 37 2
7 2017-04-13 38 1
8 2017-04-14 0 0
9 2017-04-17 3 42
10 2017-04-18 4 41
希望这有帮助!!!