我有一个日期向量和一个天数向量。
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("-")
)的定义表明其第一和第二个参数分别为e1
和e2
。所以以下内容应该有效。
lapply(number.of.days, `-`, e1=dates)
但它引发了一个错误。
-.Date
中的错误(X [[i]],...):只能从&#34;日期&#34;中减去对象
此外,以下 工作:
lapply(number.of.days, function(e1, e2) e1 - e2, e1=dates)
这是一个功能还是一个错误?
答案 0 :(得分:3)
您可以使用:
lapply(number.of.days, `-.Date`, e1=dates)
部分问题是-
是一个不进行参数匹配的原语。请注意它们是如何相同的:
> `-`(e1=5, e2=3)
[1] 2
> `-`(e2=5, e1=3)
[1] 2
本小节适用于闭包但不适用于基本函数。后者通常忽略标签并进行位置匹配,但是应该查看其帮助页面的异常,包括log,round,signif,rep和seq.int。
因此,在您的情况下,您最终使用dates
作为-
的第二个参数,即使您尝试将其指定为第一个参数。通过使用&#34;日期&#34; -
的方法,它不是原始的,我们可以让它工作。
从技术上讲,您所看到的行为是一种特征,或者可能是一种记录不一致的行为&#34;。可能被认为是错误的部分是R将对&#34;日期&#34;进行多次调度。 -
的方法,尽管该方法不支持非日期参数作为第一个参数:
> 1:4 - dates # dispatches to `-.Date` despite first argument not being date
Error in `-.Date`(1:4, dates) : can only subtract from "Date" objects
答案 1 :(得分:1)
使用POSIXt日期可能会更好。它们更灵活一些,例如,如果你想增加一周或一年。 @BrodieG使用lubridate
功能与POSIXt一起使用的等效答案:
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)
另外,费城的钓鱼怎么样? :)