计算两个日期之间不包括星期日的天数并在 R DataFrame 中创建一个新列

Counting the number of days excluding Sundays between two dates and creating a new column in R DataFrame

我在 R 中有一个 data.frame,其中包括两个带有开始日期和结束日期的变量。我想添加一个新列,其中包含两个日期之间的天数,并将结果减少每个间隔中的星期日数。我试过如下但它不起作用:

Data$Start <- as.Date(Data$Start, "%d.%m.%y")
Data$End <- as.Date(Data$End,"%d.%m.%y")

interval <- difftime(Data$Start, Data$End, units = "days")
sundays <- seq(from = Data$Start, to = Data$End, by = "days")
number.sundays <- length(which(wday(sundays)==1))

Data$DaysAhead <- interval - number.sundays

我在 seq() 函数中收到错误消息,它的长度必须为 1,但我不明白如何处理它。有人可以帮我解决这个问题吗?

这是一个有效的例子:

Data <- data.frame(
  Start = c("01.01.2020", "01.06.2020"), 
  End = c("01.03.2020", "01.09.2020")
)  

Data$Start <- as.Date(Data$Start, "%d.%m.%Y")
Data$End <- as.Date(Data$End,"%d.%m.%Y")

interval <- difftime(Data$End, Data$Start, units = "days")
sundays <- lapply(1:nrow(Data), function(i)seq(from = Data$Start[i], to = Data$End[i], by = "days"))
number.sundays <- sapply(sundays, function(x)length(which(lubridate::wday(x)==1)))

Data$DaysAhead <- interval - number.sundays

问题是 seq() 没有矢量化,它假设有一个起点和一个终点。如果你把它放在一个循环中(比如 lapply()),它就会工作并为每个开始和结束时间生成相关的序列。然后你可以使用 sapply() 计算出有多少个星期日,因为 returned 值是一个标量,sapply() 中的 return 将是一个长度与interval.

当开始日期和结束日期不在同一年时,我通过更新的数据集意识到上述解决方案存在问题。例如,我仍然想计算从 20.12.2020 到 10.01.2021 的星期日以外的日子。在这种情况下显示的错误消息是带有参数“by”的符号是错误的。我就是没办法得到它 运行 。如果我调转日期,输出将毫无意义并且天数太高。我需要做什么才能在年底得到这个 运行?