2017-01-27 2 views
0

Это должно быть довольно просто для ветеранских программистов R, но я не могу найти решение в Интернете.Ошибка с cbind на двух объектах xts

Я пытаюсь связать столбец от объекта 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.0  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 являются вводит в ненужные строки. Любая помощь будет высоко оценена.

+0

мой плохой, нашел решение. Добавление следующего решения: ttz <-Sys.getenv ('TZ') Sys.setenv (TZ = 'UTC') Но если кто-нибудь знает, почему, еще здесь, чтобы послушать мудрость – Hysterio

+0

Если вы этого не сделаете, поставьте атрибут tz, вы получите текущее время. –

+0

Спасибо, очень признателен! – Hysterio

ответ

0

Обратите внимание на раздел «Индексировано по объектам ...» вывода 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 объекты не имеют часовой пояс, так что они всегда рассматриваются в UTC в индексе XTS. POSIXctPOSIXlt) Объекты всегда имеют часовой пояс. Если атрибут часовой пояс не указан, определяется и используется текущий часовой пояс вашего компьютера (как это делается, зависит от вашей ОС и настроек).

Вы не говорите, как вы создали sym.rank, но каким-то образом вы создали его с индексом POSIXct. Поскольку у вас есть только ежедневные данные, вместо этого вы должны использовать индекс Date. Вы можете конвертировать его через:

index(sym.rank) <- as.Date(index(sym.rank)) 
# now this should work without adding rows 
merge(A, sym.rank) 
Смежные вопросы