2013-06-16 13 views
6
> 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) 

enter image description hereDlaczego nie mogę boxplot XTS bezpośrednio?

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

oczywiście ...

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

enter image description here

Nie jest to ogromny problem, ale nie chcę, aby zmusić moje XTS użytkownika za każdym razem, lub bardziej ogólnie, chciałbym wiedzieć, co się tutaj dzieje, w przypadku innych problemów, które mogą się ujawnić.

Odpowiedz

5

Obiekt jest macierzą z indeksem, więc nie można po prostu przekazać obiektu do boxplot(). Jeśli spojrzeć na 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 

Możesz uzyskać dostęp do macierzy poprzez 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 

które można wykorzystać bezpośrednio jednak należałoby użyć matrycy:

boxplot(coredata(xx)) 

enter image description here

Jeśli chcesz użyć indeksu xts obiekt, wystarczy użyć 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" 
+0

Ok dzięki. To ładnie wyjaśnia sprawę. Sądzę, że w codziennym użytkowaniu obiekty xts zachowują się podobnie do matryc, które, jak przypuszczałem, "działają" tylko przy pomocy pudełek. Tak długo, jak rozumiem, dlaczego nie, dostaję wgląd w to, jakie inne problemy mogę napotkać w przyszłości, pomagając w debugowaniu. –

3

bo tam żadnej funkcji boxplot.xts. Napisz to, a magicznie możesz zrobić boxplot (anxtsobject). Jeśli autor Xts to lubi, może nawet dostać się do paczki. Och, to może być prawdą tylko, jeśli xts są klasami S3 ...

Czy potrafisz zrobić hist (anxtsobject)?

+0

+1! dla "Oh, to może być prawdą tylko jeśli xts są klasami S3 ..." Dla 'hist' możesz zrobić coś jak' chart.Histogram (anxtsobject) '... – agstudy

3

Można użyć PerformanceAnalytics pakiet jak to na przykład:

library(PerformanceAnalytics) 
chart.Boxplot(xx) 

enter image description here

Wewnętrznie obiekt xts jest doprowadzania do data.frame, następnie boxplot można nazwać:

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