为什么我不能直接打包xts?

Tho*_*wne 6 r xts

> x <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
> x
             a          b            c
1  -1.09651022 -0.7416278  0.209405373
2   1.53644398 -0.9463432  0.374955227
3   1.71132675 -0.3828052  2.024143398
4  -1.10622882 -0.3599187 -0.808780103
5  -0.49616562  0.7061180  0.644142118
6  -1.75452442  0.3890812 -0.623815889
7   0.06315648  0.5103820 -1.501873998
8   0.64856129 -1.0973679  1.432024595
9  -0.62828873 -0.3159317  0.183674189
10 -0.82657934  1.6376569 -0.003601196
> rownames(x) <- as.Date(Sys.Date() - 9:0)
> x
                     a          b            c
2013-06-07 -1.09651022 -0.7416278  0.209405373
2013-06-08  1.53644398 -0.9463432  0.374955227
2013-06-09  1.71132675 -0.3828052  2.024143398
2013-06-10 -1.10622882 -0.3599187 -0.808780103
2013-06-11 -0.49616562  0.7061180  0.644142118
2013-06-12 -1.75452442  0.3890812 -0.623815889
2013-06-13  0.06315648  0.5103820 -1.501873998
2013-06-14  0.64856129 -1.0973679  1.432024595
2013-06-15 -0.62828873 -0.3159317  0.183674189
2013-06-16 -0.82657934  1.6376569 -0.003601196
> class(x)
[1] "data.frame"
> boxplot(x)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

> xx <- as.xts(x, order.by = as.Date(rownames(x)))
> xx
                     a          b            c
2013-06-07 -1.09651022 -0.7416278  0.209405373
2013-06-08  1.53644398 -0.9463432  0.374955227
2013-06-09  1.71132675 -0.3828052  2.024143398
2013-06-10 -1.10622882 -0.3599187 -0.808780103
2013-06-11 -0.49616562  0.7061180  0.644142118
2013-06-12 -1.75452442  0.3890812 -0.623815889
2013-06-13  0.06315648  0.5103820 -1.501873998
2013-06-14  0.64856129 -1.0973679  1.432024595
2013-06-15 -0.62828873 -0.3159317  0.183674189
2013-06-16 -0.82657934  1.6376569 -0.003601196
> class(xx)
[1] "xts" "zoo"
> boxplot(xx)
Error in try.xts(c(2.12199579096527e-314, 2.12199579096527e-314, 0, 2.12199579096527e-314,  : 
  Error in xts(coredata(x), order.by = index(x), .CLASS = "xts", ...) :   order.by requires an appropriate time-based object
> 
Run Code Online (Sandbox Code Playgroud)

当然...

> boxplot(as.matrix(xx), col = "red")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这不是一个大问题,但我不想每次都强迫我的xts,或者更一般地说,我想知道这里发生了什么,以防有可能发现的其他问题.

ale*_*han 7

一个xts对象是一个矩阵加上索引,所以你不能只是传递的对象boxplot().如果你看看str(xx):

# An ‘xts’ object from 2013-06-07 to 2013-06-16 containing:
#   Data: num [1:10, 1:3] 0.321 -0.462 1.715 0.575 0.83 ...
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:3] "a" "b" "c"
# Indexed by objects of class: [Date] TZ: 
#   xts Attributes:  
#   NULL
Run Code Online (Sandbox Code Playgroud)

您可以通过coredata()以下方式访问矩阵:

coredata(xx)
#                a           b            c
# [1,]  0.32120813 -0.07370657 -0.601288169
# [2,] -0.46154742 -1.09475940  3.028664653
# [3,]  1.71515544 -0.31000454 -0.009281175
# [4,]  0.57482616 -0.06260991  1.198034802
# [5,]  0.83015688 -2.49614565 -1.689812377
# [6,]  0.01748081 -0.55332675  2.391426111
# [7,]  0.69852800 -0.10337251 -0.267939285
# [8,]  0.75139113 -0.17427970 -0.561434122
# [9,] -0.68942598  0.18685817 -1.508917140
# [10,] -0.76381007 -2.44387628  0.290524821
Run Code Online (Sandbox Code Playgroud)

你可以直接使用哪个你会使用矩阵:

boxplot(coredata(xx))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果要使用xts对象的索引,只需使用index():

index(xx)
# [1] "2013-06-07" "2013-06-08" "2013-06-09" "2013-06-10" "2013-06-11" "2013-06-12" "2013-06-13" "2013-06-14" "2013-06-15"
# [10] "2013-06-16"
Run Code Online (Sandbox Code Playgroud)