1

我在 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,但我不明白如何处理这个问题。有人可以帮我解决这个问题吗?

4

2 回答 2

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()它来计算有多少个星期日,并且由于返回值是一个标量,返回 fromsapply()将是一个与 . 长度相同的向量interval

于 2021-01-16T15:32:11.460 回答
0

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

于 2021-02-01T19:28:39.123 回答