如何迭代日期列表而不强制R中的数字?

时间:2013-01-25 17:54:37

标签: r list date

这与Looping over a datetime object results in a numeric iterator

有关
> 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. 我不理解约书亚的答案(上面链接的问题接受了答案),我在这里引用它:“因此Date向量被强制转移到numeric因为Date对象不是严格的向量“。那么如何确定Date应该被强制转换为numeric

1 个答案:

答案 0 :(得分:13)

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

<强>输入

For循环将Date输入强制转移到numeric,因为@DWin和@JoshuaUlrich指出,for循环占用vectors,而Date是技术上不是载体。

> 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对象,则可以使用lapplysapply。如果您有非Date对象,并且想要返回Date个对象,则可以使用for循环或lapply。如果您有Date个对象并想要返回Date个对象,请使用lapply

了解更多资源

如果您想深入了解向量,可以从John Cook's notes开始,继续R Inferno,然后继续SDA