【发布时间】:2018-11-18 21:07:51
【问题描述】:
我需要编写一个函数来计算工作日数(减去周末,以及其他当地银行假期的向量),但我遇到的问题更简单地说明了只计算工作日的数量工作日。
这是一个函数,它将给出两个日期之间的工作日数:
removeWeekends <- function(end, start){
range <- as.Date(start:end, "1970-01-01")
range<- range[sapply(range, function(x){
if(!chron::is.weekend(x)){
return(TRUE)
}else{
return(FALSE)
}
})]
return(NROW(range))
}
当它为每个参数指定一个日期时有效:
removeWeekends(as.Date("2018-05-08"), as.Date("2018-06-08"))
#[1] 24
但是当它从一个数据帧中获得两个向量时,它会失败:
one <- as.Date("2017-01-01"):as.Date("2017-01-08")
two <- as.Date("2018-06-08"):as.Date("2018-06-15")
df <- data.frame(one, two)
removeWeekends(df$two, df$one)
#[1] 375
#Warning messages:
#1: In start:end : numerical expression has 8 elements: only the first used
#2: In start:end : numerical expression has 8 elements: only the first used
我也尝试过(我猜这不会起作用,因为语法似乎不对):
lapply(df, removeWeekends, df$two, df$one)
#Error in FUN(X[[i]], ...) : unused argument (17167:17174)
还有:
lapply(df[,c("two", "one")], removeWeekends)
#Error in as.Date(start:end, "1970-01-01") : argument "start" is missing,
# with no default
我假设是我误解了矢量化的概念。
我唯一的另一个想法是将函数嵌套在条件中以查看它是否是向量,然后在其上调用 apply 函数,尽管我也不太确定我将如何构造它。
【问题讨论】:
-
apply(df, 1, removeWeekends)?
标签: r function dataframe vector vectorization