这与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"
我有两个问题:
Date
向量被强制转移到numeric
因为Date
对象不是严格的向量“。那么如何确定Date
应该被强制转换为numeric
?答案 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
对象,则可以使用lapply
或sapply
。如果您有非Date
对象,并且想要返回Date
个对象,则可以使用for
循环或lapply
。如果您有Date
个对象并想要返回Date
个对象,请使用lapply
。
了解更多资源
如果您想深入了解向量,可以从John Cook's notes开始,继续R Inferno,然后继续SDA。