12

这与在 Date 或 POSIXct 对象上循环导致数字迭代器有关

> dates <- as.Date(c("2013-01-01", "2013-01-02"))
> class(dates)
[1] "Date"
> for(d in dates) print(class(d))
[1] "numeric"
[1] "numeric"

我有两个问题:

  1. 迭代 Date 对象列表的首选方法是什么?
  2. 我不明白 Joshua 的答案(从上面链接的问题中接受的答案),我会在这里引用它:“所以你的Date向量被强制为,numeric因为Date对象不是严格的向量”。那么如何确定Date应该被强制numeric呢?
4

1 回答 1

13

这里有两个问题。一个是输入是否被强制从Dateto numeric。另一个是输出是否被强制转换为numeric.

输入

For 循环强制Date输入到numeric,因为正如@DWin 和@JoshuaUlrich 指出的那样,for循环 takevectorsDates 在技术上不是向量。

> for(d in dates) print(class(d))
[1] "numeric"
[1] "numeric"

另一方面,lapply它的简化子代sapply没有这样的限制。

> sapply( dates, function(day) class(day) )
[1] "Date" "Date"

输出

然而!上面的输出class()是一个字符。如果您尝试实际返回日期对象,sapply则不是您想要的。

lapply不会强制转换为向量,但sapply会:

> lapply( dates, identity )
[[1]]
[1] "2013-01-01"

[[2]]
[1] "2013-01-02"

> sapply( dates, identity )
[1] 15706 15707

这是因为sapply的简化函数将输出强制转换为向量。

概括

所以:如果你有一个Date对象并且想要返回一个非Date对象,你可以使用lapplyor sapply。如果您有一个非Date对象,并且想要返回一个Date对象,则可以使用for循环或lapply. 如果您有一个Date对象并想要返回一个Date对象,请使用lapply.

更多学习资源

如果您想更深入地研究向量,您可以从John Cook 的笔记开始,继续阅读 R Inferno,然后继续阅读 SDA

于 2013-01-25T18:03:42.337 回答