R 如何在不强制使用数字的情况下迭代日期列表?
这与R 如何在不强制使用数字的情况下迭代日期列表?,r,list,date,for-loop,R,List,Date,For Loop,这与 >日期类(日期) [1] “日期” >用于(日期中的d)打印(d类) [1] “数字” [1] “数字” 我有两个问题: 迭代日期对象列表的首选方式是什么 我不明白Joshua的答案(接受了上面链接的问题的答案),我在这里引用它:“所以你的Date向量被强制为numeric,因为Date对象并不是严格意义上的向量。”。那么,如何确定应将日期强制为数字 这里有两个问题。一是输入是否从Date强制到numeric。另一个问题是输出是否强制为numeric 输入 For循环强制日期输入到数值,
>日期类(日期)
[1] “日期”
>用于(日期中的d)打印(d类)
[1] “数字”
[1] “数字”
我有两个问题:
Date
向量被强制为numeric
,因为Date
对象并不是严格意义上的向量。”。那么,如何确定应将日期
强制为数字
这里有两个问题。一是输入是否从
Date
强制到numeric
。另一个问题是输出是否强制为numeric
输入
For循环强制日期
输入到数值
,因为正如@DWin和@JoshuaUlrich所指出的,For
循环采用向量
,而日期
从技术上讲不是向量
> for(d in dates) print(class(d))
[1] "numeric"
[1] "numeric"
另一方面,lappy
及其简化子代sapply
没有这样的限制
> sapply( dates, function(day) class(day) )
[1] "Date" "Date"
输出
然而!上面的class()
的输出是一个字符。如果您尝试实际返回日期对象,sapply
不是您想要的
lappy
不会强制为向量,但sapply
会:
> lapply( dates, identity )
[[1]]
[1] "2013-01-01"
[[2]]
[1] "2013-01-02"
> sapply( dates, identity )
[1] 15706 15707
这是因为sapply
的简化函数将输出强制为向量
摘要
因此:如果您有一个Date
对象,并且想要返回一个非Date
对象,那么可以使用lappy
或sapply
。如果您有一个非Date
对象,并且希望返回Date
对象,那么可以使用for
循环或lappy
。如果您有一个Date
对象,并且希望返回一个Date
对象,请使用lappy
了解更多信息的资源
如果您想深入研究向量,可以从开始,继续,然后继续。我的评论是:
是.vector(dates)#FALSE
,所以日期不是“向量”。你的第二个问题应该是对我上一个答案的评论。很明显,dates
不是一个向量,它显然是Date
。但是什么让它表现得像一个向量呢。是什么使它变得可用?从帮助页?vector
。“对于任何模式,如果x具有除名称以外的任何属性,则它[is.vector
]将返回FALSE。”在R语言中,“vector”并不意味着它可以通过位置访问,而是它没有属性。它特别指出因子不是向量,它可能还应该说明Date和POSIXt分类对象也不是。您可以将日期
保留为字符向量,并在循环中强制执行,或者使用链接帖子中提到的seq_-along()
技术。。。(或下面的答案之一)@JoshuaUlrich@DWin我认为这不是向量的标准定义。日期是向量,但是is.vector
函数令人困惑-它告诉您是否有一个没有属性的原子向量是.atomic(as.Date(“2012-01-01”)
是真的,所以日期是原子向量。sapply
是真的,因为simplify2array
(矩阵只能容纳原子向量)。返回的是类,而不是对象本身。试试:sapply(Sys.Date(),identity)
<代码>Lappy仍然有效。那么打印日期的sapply(日期,类)呢?难道不应该强制使用数值向量吗?(根据帖子和评论)@user443854:正如我所说的,这返回了存在于函数调用中的对象类(一个字符串,它是一个原子向量);它没有返回日期。请允许我给你100美元作为“$100”@JoshuaUlrich矩阵不限于原子向量:矩阵(列表(1,2,3,4),nrow=2)
。我认为真正的解释是,simplify2array
写得不好,或者Date类缺少所需的S3方法。@AriB.Friedman@user443854不,这是不一致的,因为for
是用C写的,不看对象的类,或者使用[
提取向量的各个分量。
> lapply( dates, identity )
[[1]]
[1] "2013-01-01"
[[2]]
[1] "2013-01-02"
> sapply( dates, identity )
[1] 15706 15707