使用与日期和减号函数的lapply

时间:2015-06-10 16:49:22

标签: r lapply

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

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)

但它引发了一个错误。

  

-.Date中的错误(X [[i]],...):只能从&#34;日期&#34;中减去对象

此外,以下 工作:

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

这是一个功能还是一个错误?

2 个答案:

答案 0 :(得分:3)

您可以使用:

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

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

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

来自 R Language Definition

  

本小节适用于闭包但不适用于基本函数。后者通常忽略标签并进行位置匹配,但是应该查看其帮助页面的异常,包括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)

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