两个xts对象上的cbind错误

时间:2017-01-27 00:47:58

标签: r xts

对于经验丰富的R程序员来说,这应该相当简单,但我似乎无法在线找到解决方案。

我试图将xts对象sym.rank中的列绑定到第二个现有对象A的末尾,但结果会增加行数。来自sym.rank的数据实际上已向下移动,而不是与A中的数据正确对齐。

> str(A)
An ‘xts’ object on 2005-01-31/2012-12-31 containing:
Data: num [1:96, 1:6] 35.5 33.8 33.6 33.3 31.9 ...
-attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:6] "XLY.Open" "XLY.High" "XLY.Low" "XLY.Close" ...
Indexed by objects of class: [Date] TZ: UTC
xts Attributes:  
List of 2
$ src    : chr "yahoo"
$ updated: POSIXct[1:1], format: "2017-01-27 00:42:13"

> str(sym.rank)
An ‘xts’ object on 2005-01-31/2012-12-31 containing:
Data: num [1:96, 1:5] NA NA 5 5 4 2 2 3 5 5 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr 
[1:5] "XLY.Adjusted" "XLP.Adjusted" "XLE.Adjusted" "AGG.Adjusted" ...
Indexed by objects of class: [POSIXct,POSIXt] TZ: 
xts Attributes:  
NULL

>sym.rank
       XLY.Adjusted XLP.Adjusted XLE.Adjusted AGG.Adjusted IVV.Adjusted
2005-01-31           NA           NA           NA           NA           NA
2005-02-28           NA           NA           NA           NA           NA
2005-03-31            5            3            1            4            2
2005-04-30            5            2            4            1            3
2005-05-31            4            3            5            1            2
2005-06-30            2            5            1            4            3

> A
       XLY.Open XLY.High XLY.Low XLY.Close XLY.Volume XLY.Adjusted
2005-01-31    35.45    35.55   33.23     33.78    5464600     28.49650
2005-02-28    33.82    34.36   33.33     33.60    5813500     28.34465
2005-03-31    33.60    34.40   32.71     33.16   10675600     28.01342
2005-04-30    33.30    33.47   30.62     31.05   12504000     26.23090
2005-05-31    31.92    33.18   31.04     32.97    9032100     27.85291
2005-06-30    33.10    33.88   32.68     32.78    7248700     27.73284

> cbind(A,sym.rank[,1])
       XLY.Open XLY.High XLY.Low XLY.Close XLY.Volume XLY.Adjusted XLY.Adjusted.1
2005-01-30       NA       NA      NA        NA         NA            NA             NA
2005-01-31    35.45    35.55   33.23     33.78    5464600     28.49650             NA
2005-02-27       NA       NA      NA        NA         NA           NA             NA
2005-02-28    33.82    34.36   33.33     33.60    5813500     28.34465             NA
2005-03-30       NA       NA      NA        NA         NA           NA              5
2005-03-31    33.60    34.40   32.71     33.16   10675600     28.01342             NA

正如您所看到的,cbind命令的结果会引入不需要的行,sym.rank中的实际值会引入不需要的行。 任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

注意str()输出的“由对象索引...”部分。

> str(A)
#...
Indexed by objects of class: [Date] TZ: UTC  # Date index, UTC timezone
> str(sym.rank)
#...
Indexed by objects of class: [POSIXct,POSIXt] TZ:   # POSIXct index, no timezone

Date个对象没有时区,因此它们始终在xts索引中以UTC格式处理。 POSIXct(和POSIXlt)个对象总是有时区。如果未指定timezone属性,则确定并使用计算机的当前时区(如何完成此操作取决于您的操作系统和设置)。

您没有说明如何创建sym.rank,但不知何故,您使用POSIXct索引创建了它。由于您只有每日数据,因此应使用Date索引。您可以通过以下方式进行转换:

index(sym.rank) <- as.Date(index(sym.rank))
# now this should work without adding rows
merge(A, sym.rank)