> 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
>
当然......
> boxplot(as.matrix(xx), col = "red")
这不是一个大问题,但我不想每次都强迫我的xts,或者更一般地说,我想知道这里发生了什么,以防有可能发现的其他问题。
答案 0 :(得分: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
您可以通过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
您可以直接使用,但是您可以使用矩阵:
boxplot(coredata(xx))
如果您想使用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"
答案 1 :(得分:3)
因为没有boxplot.xts功能。写它,神奇地你可以做boxplot(anxtsobject)。如果xts的作者喜欢它,它甚至可能进入包中。哦,如果xts是S3类,那可能只是真的......
你能做hist(anxtsobject)吗?
答案 2 :(得分:3)
您可以使用PerformanceAnalytics
这样的包,例如:
library(PerformanceAnalytics)
chart.Boxplot(xx)
在内部,xts
对象被强制转换为data.frame
,然后可以调用boxplot
:
library(PerformanceAnalytics)
R <- checkData(xx, method = "data.frame")
boxplot(R)