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

use*_*854 12 r date list

这与在datetime对象循环导致数字迭代器有关

> 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"
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 迭代Date对象列表的首选方法是什么?
  2. 我不明白约书亚的答案(从上面链接的问题中接受的答案),我在这里引用它:"所以你的Date矢量被强迫,numeric因为Date物体不是严格的矢量".那么如何确定Date应该被胁迫numeric呢?

Ari*_*man 13

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

输入

For循环强制Date输入numeric,因为@DWin和@JoshuaUlrich指出,for循环占用vectors,而Dates在技术上不是向量.

> for(d in dates) print(class(d))
[1] "numeric"
[1] "numeric"
Run Code Online (Sandbox Code Playgroud)

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

> sapply( dates, function(day) class(day) )
[1] "Date" "Date"
Run Code Online (Sandbox Code Playgroud)

产量

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

lapply不强迫矢量,但sapply确实:

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

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

> sapply( dates, identity )
[1] 15706 15707
Run Code Online (Sandbox Code Playgroud)

那是因为sapply简化功能将输出强制转换为矢量.

摘要

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

学习更多的资源

如果你想深入研究向量,你可以从John Cook的笔记开始,继续使用R Inferno,继续使用SDA.

  • @JoshuaUlrich矩阵不仅限于原子向量:`matrix(list(1,2,3,4),nrow = 2)`.我认为真正的解释是"simplify2array"写得不好,或者Date类缺少需要的S3方法. (2认同)