Why can't I boxplot an xts directly?

﹥>﹥吖頭↗ 提交于 2019-12-10 14:14:19

问题


> 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)

> 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
> 

of course...

> boxplot(as.matrix(xx), col = "red")

Not a huge problem but I don't want to have to coerce my xts's every time, or more generally, I'd like to know what's going on here in case there are other issues which this might uncover.


回答1:


An xts object is a matrix plus an index, so you can't just pass the object to boxplot(). If you look at 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

You can access the matrix through 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

Which you can use directly however you would use a matrix:

boxplot(coredata(xx))

If you want to use the index of the xts object, you just use 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"



回答2:


Because theres no boxplot.xts function. Write it, and magically you can do boxplot(anxtsobject). If the author of xts likes it, it might even get into the package. Oh, that might only be true if xts are S3 classes...

Can you do hist(anxtsobject)?




回答3:


You can use PerformanceAnalytics package like this for example:

library(PerformanceAnalytics)
chart.Boxplot(xx)

Internally , the xts object is coerced to a data.frame, then boxplot can be called:

library(PerformanceAnalytics)
R <- checkData(xx, method = "data.frame")
boxplot(R)


来源:https://stackoverflow.com/questions/17132630/why-cant-i-boxplot-an-xts-directly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!