Добавьте два объекта xts в один столбец фрейма данных - PullRequest
0 голосов
/ 06 марта 2011

Вот результат, которого я хочу достичь:

             Trade Time     Last  Yesterday Close
GLD 2011-03-04 04:00:00 139.3500           138.09  
SLV 2011-03-04 04:00:00  34.6925            33.42

Чтобы получить первые два столбца,

require("quantmod")

intra <- getQuote("GLD;SLV", what=yahooQF("Last Trade (Price Only)")) 

>intra
             Trade Time     Last
GLD 2011-03-04 04:00:00 139.3500
SLV 2011-03-04 04:00:00  34.6925

> class(intra)
[1] "data.frame"

Чтобы получить вчерашнее закрытие,

require("quantmod")

getSymbols("GLD;SLV")

GLD <- GLD[,4]    #only the close
SLV <- SLV[,4]

GLD  <- head(tail(GLD, n=2), n=1)   #only yesterday
SLV  <- head(tail(SLV, n=2), n=1)

GLD  <- as.vector(GLD)  #prepare for merge with intra data.frame
SLV  <- as.vector(SLV)

EOD <- rbind(GLD, SLV)

> EOD
      [,1]
GLD 138.09
SLV  33.42

> class(EOD)
[1] "matrix"

Тогда наивный подход слияния ()

> super <- merge(intra, EOD)

> class(super)
[1] "data.frame"

> super
           Trade Time     Last   [,1]
1 2011-03-04 04:00:00 139.3500 138.09
2 2011-03-04 04:00:00  34.6925 138.09
3 2011-03-04 04:00:00 139.3500  33.42
4 2011-03-04 04:00:00  34.6925  33.42

Близко, но что-то ужасно не так. Во-первых, я потерял описательные метки GLD и SLV, которые были на внутреннем data.frame. Во-вторых, у меня четыре строки вместо двух (загадочное дублирование).

Советы по рефакторингу всегда приветствуются.

1 Ответ

2 голосов
/ 06 марта 2011

Это то, что вы имеете в виду?

intra$YesterdayClose <- EOD
intra
             Trade.Time     Last YesterdayClose
GLD 2011-03-04 04:00:00 139.3500         138.09
SLV 2011-03-04 04:00:00  34.6925          33.42

Это предполагает тот же порядок в EOD, что и в кадре данных, если это не так, то вы можете сделать это:

intra$YesterdayClose <- EOD[match(rownames(EOD),rownames(intra))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...