如何合并具有略微不同列的xts对象?

时间:2016-01-03 17:44:56

标签: r xts

给出了各种一行xts对象:

z1 = xts(t(c("9902"=0,"9903"=0,"9904"=0,"9905"=2,"9906"=2)),as.Date("2015-01-01"))
z2 = xts(t(c("9902"=3,"9903"=4,"9905"=6,"9906"=5,"9908"=8)),as.Date("2015-01-02"))
z3 = xts(t(c("9901"=1,"9903"=3,"9905"=5,"9906"=6,"9907"=7,"9909"=9)),as.Date("2015-01-03"))

我想将它们合并到一个xts对象中。但是cbind(z1,z2,z3)给出了:

           X9902 X9903 X9904 X9905 X9906 X9902.1 X9903.1 X9905.1 X9906.1 X9908 X9901 X9903.2 X9905.2 X9906.2 X9907 X9909
2015-01-01     0     0     0     2     2      NA      NA      NA      NA    NA    NA      NA      NA      NA    NA    NA
2015-01-02    NA    NA    NA    NA    NA       3       4       6       5     8    NA      NA      NA      NA    NA    NA
2015-01-03    NA    NA    NA    NA    NA      NA      NA      NA      NA    NA     1       3       5       6     7     9

而我期望的是:

           9901 9902 9903 9904 9905 9906 9907 9908 9909
2015-01-01    0    0    0    0    2    2    0    0    0
2015-01-02    0    3    4    0    6    5    0    8    0
2015-01-03    1    0    3    0    5    6    7    0    9

(我可以通过提供fill=0将NAs更改为零,即cbind(z1,z2,z3,fill=0)。)

rbind(z1,z2,z3)抱怨行有不同的列数。但是,我相信如果事先将缺少的列添加到每个xts对象中,这将是一个很好的方法吗?

真实数据可能有1000行,有几百列(一旦合并),所以我只关注效率。

2 个答案:

答案 0 :(得分:4)

正如我在评论中提到的,merge.xts(和merge.zoo)仅按索引合并,因此您无法使用merge(或{{1}获得所需结果}})。所以看起来你确实需要cbind,但是(如你所说)它将要求所有对象具有相同顺序的列数。

我已在下面创建了两个函数来帮助处理对象,以便您rbind创建所需的结果。

rbind

答案 1 :(得分:1)

library(xts)
library(plyr)

z1df <- as.data.frame(z1)
z2df <- as.data.frame(z2)
z3df <- as.data.frame(z3)

res <- rbind.fill(z1df, z2df, z3df)
res[is.na(res)] <- 0
res

#  9902 9903 9904 9905 9906 9908 9901 9907 9909
#1    0    0    0    2    2    0    0    0    0
#2    3    4    0    6    5    8    0    0    0
#3    0    3    0    5    6    0    1    7    9

这类似于以下stackoverflow帖子

combining two data frames of different lengths

包括日期列

res$Date <- c("2015-01-01", "2015-01-02", "2015-01-03") # the appropriate values
res$Date <- as.Date(res$Date)

转换为xts对象

xts(res[,-10], order.by=res[,10])