我在R中有一个函数,给定n天,返回最后n个工作日的列表.我的解决方案工作正常,但感觉不够优雅,我想知道是否有任何简单的方法来改善它.
WeekdayList <- function(n) {
Today <- as.Date(Sys.time())
days <- c(Today)
i <- 1
while (length(days) < n) {
NewDay <- as.Date(Today-i)
if (!weekdays(NewDay) %in% c("Saturday", "Sunday")) {
days <- c(days,NewDay)
}
i <- i+1
}
days
}
WeekdayList(30)
WeekdayList(2)
Run Code Online (Sandbox Code Playgroud)
排除假期也是一个很好的功能.
矢量化代码在R中是必不可少的.以下是示例:
WeekdayList2 <- function(n) {
Today <- as.Date(Sys.time())
dayz <- seq(Today, Today - 2 * n, "-1 days")
dayz <- dayz[!(weekdays(dayz) %in% c("Saturday", "Sunday"))]
dayz <- dayz[seq_len(n)]
return(dayz)
}
identical(WeekdayList2(1000), WeekdayList(1000))
system.time(WeekdayList2(10000))
system.time(WeekdayList(10000))
[1] TRUE
user system elapsed
0 0 0
user system elapsed
4.90 0.00 4.91
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,即使我的函数创建的向量两次几乎是它所需的两倍(然后删除周末),它比使用"for"循环要快得多.我的计算机甚至无法运行你的功能n = 100000(不管你多少天都关心它),但是WeekdayList2几乎可以立即运行它.
由于假期与您所处的位置相关,因此您可能需要手动上载日期列表,并添加其他条件以从数据中过滤掉这些日期.