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

zoo object just inserted random rows when I tried cbind. What happened?

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

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 class 对象,给出 zoo(as.character(11:13), 1:3) 然后它将第二个参数 (integer) 的索引 class 强制转换为与第一个参数 (Date) 具有相同的索引 class。警告消息确实警告正在使用不同的索引 classes。

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"