当我尝试cbind时,zoo对象刚插入随机行。发生了什么?

问题描述 投票:2回答:1

我不确定我的动物园对象发生了什么。我试图将另一列绑定到我的zoo对象,突然我的索引爆炸了。这是我尝试过的:

dates.zoo <- zoo(data.frame(val=seq(1:121)), order.by = seq.Date(as.Date('2018-12-01'), as.Date('2019-03-31'), "days"))
cbind(dates.zoo, ti=as.character(1:nrow(dates.zoo)))
           val  ti  
1970-01-02 <NA> 1   
1970-01-03 <NA> 2   
1970-01-04 <NA> 3   
1970-01-05 <NA> 4   
...

1970年从哪里来?它从来没有在原始的zoo对象中(在我绑定一个新列之前)

r zoo
1个回答
4
投票

如果我们将示例缩小,则会更容易一些。下面的代码强制给出zoozoo(as.character(11:13), 1:3)类对象的第二个参数,然后它强制第二个参数(integer)的索引类与第一个参数(Date)具有相同的索引类。警告消息确实警告正在使用不同的索引类。

cbind.zoo确实有处理普通向量的特殊处理,但前提是它们与动物园对象的核心数据类型相同。如果使用与第一个参数的核心数据相同类型的普通向量,即两个numeric,它将按预期工作。标有correct的注释掉的线显示了这一点。

library(zoo)
dates.zoo <- zoo(data.frame(val= 1:3), as.Date('2019-01-03') + 0:2)
# cbind(dates.zoo, ti=11:13) # correct
cbind(dates.zoo, ti=as.character(11:13)) # incorrect

这使:

           val  ti  
1970-01-02 <NA> 11  
1970-01-03 <NA> 12  
1970-01-04 <NA> 13  
2019-01-03 1    <NA>
2019-01-04 2    <NA>
2019-01-05 3    <NA>
Warning message:
In merge.zoo(..., all = all, fill = fill, suffixes = suffixes, retclass = "zoo",  :
  Index vectors are of different classes: Date integer

另请注意:

as.Date(1:3)
## [1] "1970-01-02" "1970-01-03" "1970-01-04"
© www.soinside.com 2019 - 2024. All rights reserved.