【问题标题】:Error with cbind on two xts objects两个 xts 对象上的 cbind 错误
【发布时间】:2017-02-16 00:33:39
【问题描述】:

这对于资深 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 的实际值被引入了不需要的行中。 任何帮助将不胜感激。

【问题讨论】:

  • 我的错,找到了解决方案。添加以下内容可以解决问题: ttz
  • 如果您不提供 tz 属性,您将获得当前时区。
  • 谢谢,非常感谢!

标签: r xts


【解决方案1】:

注意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)对象总是有一个时区。如果未指定时区属性,则会确定并使用您计算机的当前时区(如何完成取决于您的操作系统和设置)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 2012-05-03
    • 2018-06-04
    • 2012-11-22
    • 2021-02-24
    • 1970-01-01
    • 2017-12-14
    • 2013-05-27
    相关资源
    最近更新 更多