问题描述
|
为什么遍历
Date
或POSIXct
对象会导致numeric
?例如:
test = as.Date(\"2009-01-01\")
print( class( test ) )
# [1] \"Date\"
for ( day in test )
{
print( class( day ) )
}
# [1] \"numeric\"
POSIXct
也会发生相同的情况:
test = as.POSIXct(\"2009-01-01\")
print( class( test ) )
# [1] \"POSIXct\" \"POSIXt\"
for ( day in test )
{
print( class( day ) )
}
# [1] \"numeric\"
解决方法
?\"for\"
表示seq
(in
之后的部分)是\“ [A] n表达式,其值是向量(包括列表和表达式)或成对列表或\'NULL \'\”。
因此,您的Date
向量被强制为numeric
,因为Date
对象不是严格的向量:
is.vector(Sys.Date())
# [1] FALSE
is.vector(as.numeric(Sys.Date()))
# [1] TRUE
POSIXct
向量也是如此:
is.vector(Sys.time())
# [1] FALSE
is.vector(as.numeric(Sys.time()))
# [1] TRUE
, 遍历天数(字符串):
days <- seq(from=as.Date(\'2011-02-01\'),to=as.Date(\"2011-03-02\"),by=\'days\' )
for ( i in seq_along(days) )
{
print(i)
print(days[i])
}
, 使用for循环时,您没有选择正确的函数应用于Date
向量。最好将seq_along
换成几乎每个循环的日期或因素。然后,您将做两件事:a)对其进行设置,以便期望索引从1开始,并且b)防止零长度向量发生的奇怪现象。我还认为将它与因子一起使用会更好,for循环将转化为字符向量。
关于约书亚的答案(肯定是正确和有用的),我认为is.vector
函数的标签有点误解,或者只是被误解了。它可以更准确地称为“ 19”。大多数人认为\ vector的属性是用is.atomic
和tested0ѭ和POSIXct
对象测试的,将从该测试返回TRUE
。
, 似乎实现for
循环的C函数不会复制该向量的任何属性。这还包括“ 25”属性,应使“ 26”看起来像是“ 0”对象。
您可以在此处学习do_for(SEXP,SEXP,SEXP)
函数的源代码(R \的for
调用的源代码)。
, 这是一个古老的问题,但是我是R的新手,并且遇到了相同的问题。由于我的问题将被并行处理,因此我使用foreach并发现与正常的for
相比,行为是不同的:
library(foreach)
start_date = as.Date(\"2013-08-1\")
end_date = as.Date(\"2013-08-13\")
days = seq(start_date,end_date,by = \"day\")
foreach(day = days,.combine=\'rbind\') %dopar% {
print(class(day))
}
[1] \"Date\"
[1] \"Date\"
[1] \"Date\"
[1] \"Date\"
...
由于我对大多数R的内在事物没有经验,因此我不知道为什么foreach
最终会表现出不同的行为,但对于我的目的却起作用,并且希望对其他人有用。
, 对日期对象的任何数字运算通常都会返回天数。在此,您要求它为您提供距纪元的天数。 14245,这是1970-01-01-2009-01-01之间的天数
从?日期:
日期表示为
1970年1月1日以来的天数,负数
较早日期的值。他们是
始终遵循以下规则打印
当前的公历,甚至
尽管该日历未使用
很久以前(它于1752年在
英国及其殖民地)。
预期日期应为
整数,但不强制执行
在内部表示中。
小数日将被忽略
印刷。有可能产生
通过均值方法的分数天或
通过加或减(请参见
行动日期)。
尝试加print(day)
以了解我的意思。
test = as.Date(\"2009-01-01\")
print( class( test ) )
for ( day in test )
{
print(day)
print( class( day ) )
}