将 lapply 与日期和减号函数一起使用

Using lapply with Dates and the minus function

我有一个日期向量和一个天数向量。

dates <- seq(Sys.Date(), Sys.Date()+10, by='day')
number.of.days <- 1:4

我需要得到一个列表,每个天数都有一个条目,列表中的每个条目都是日期向量减去相应的天数,即

list(dates-1, dates-2, dates-3, dates-4)

-(function (e1, e2) .Primitive("-"))的定义表明它的第一个和第二个参数分别是e1e2。所以下面应该工作。

lapply(number.of.days, `-`, e1=dates)

但是它引发了一个错误。

Error in -.Date(X[[i]], ...) : can only subtract from "Date" objects

此外,以下 确实 有效:

lapply(number.of.days, function(e1, e2) e1 - e2, e1=dates)

这是功能还是错误?

您可以使用:

lapply(number.of.days, `-.Date`, e1=dates)

部分问题是 - 是一个不进行参数匹配的原语。请注意它们是如何相同的:

> `-`(e1=5, e2=3)
[1] 2
> `-`(e2=5, e1=3)
[1] 2

来自R Language Definition:

This subsection applies to closures but not to primitive functions. The latter typically ignore tags and do positional matching, but their help pages should be consulted for exceptions, which include log, round, signif, rep and seq.int.

所以在你的情况下,你最终使用 dates 作为 - 的第二个参数,即使你试图将它指定为第一个。通过使用 - 的 "Date" 方法,这不是原始的,我们可以让它工作。

所以从技术上讲,您看到的行为是一个功能,或者可能是一个 "documented inconsistency"。可能被认为是错误的部分是 R 将多次分派到 - 的 "Date" 方法,尽管该方法不支持非日期参数作为第一个参数:

> 1:4 - dates  # dispatches to `-.Date` despite first argument not being date
Error in `-.Date`(1:4, dates) : can only subtract from "Date" objects

您最好使用 POSIXt 日期。它们更灵活一些,例如,如果您想添加一周或一年。使用 lubridate 功能与 POSIXt 一起工作的@BrodieG 的等效答案:

dates <- ymd(seq(Sys.Date(), Sys.Date()+10, by='day'))
number.of.days <- 1:4

list(dates-1, dates-2, dates-3, dates-4)

lapply(number.of.days, `-.POSIXt`, e1=dates)

另外,在费城钓鱼怎么样? :)