Объединить два объекта xts (матрицы) в один массив в R

У меня есть два объекта xts.

> require(quantmod)

> getSymbols("GLD;SLV")
[1] "GLD" "SLV"

> head(SLV, n=2)
           SLV.Open SLV.High SLV.Low SLV.Close SLV.Volume SLV.Adjusted
2007-01-03   129.96   131.16  124.70    125.58    7480000        12.56
2007-01-04   126.04   127.97  125.45    125.80    3220000        12.58

> head(GLD, n=2)
           GLD.Open GLD.High GLD.Low GLD.Close GLD.Volume GLD.Adjusted
2007-01-03    63.58    64.02   62.00     62.28    8061900        62.28
2007-01-04    62.07    62.50   61.52     61.65    4858600        61.65

> NROW(SLV) == NROW(GLD)
[1] TRUE

Как можно «сложить» эти отдельные двумерные матрицы в один трехмерный массив?

Что-то вроде следующего:

metal <- xts_stacking_function (GLD, SLV)

class(metal)
[1] "array"

metal[1,,1]
              GLD.Open GLD.High GLD.Low GLD.Close GLD.Volume GLD.Adjusted
2007-01-03    63.58    64.02      62     62.28    8061900        62.28

person Milktrader    schedule 18.04.2011    source источник
comment
Во-первых, GLD и SLV — это не массивы, а объекты xts. Во-вторых, что вы подразумеваете под трехмерным массивом? Если вы хотите, чтобы они совместно использовали индекс, попробуйте newvar‹-merge(SLV, GLD).   -  person bill_080    schedule 18.04.2011
comment
Можете ли вы привести пример вывода, который вы хотите?   -  person Joshua Ulrich    schedule 18.04.2011
comment
@bill merge(SLV, GLD) вернет двухмерный объект xts, а не объект массива, который я ищу.   -  person Milktrader    schedule 19.04.2011
comment
@Milktrader: Это должен быть массив? Будет ли работать список объектов xts? Если вы немного подробнее опишете то, что пытаетесь сделать, возможно, мы сможем создать решение.   -  person Joshua Ulrich    schedule 20.04.2011
comment
@ Джошуа, я подумал об использовании списка объектов xts вместо массива и подумал, что, возможно, массив будет проще, но я пересматриваю этот подход. Моя конечная цель состоит в том, чтобы организовать большую группу перестановок торговой системы, каждой из которых соответствует свой торговый сигнал и прибыль, а затем легко произвести вычисления во всем «пространстве». Я еще немного подумаю и, возможно, задам лучший вопрос.   -  person Milktrader    schedule 20.04.2011


Ответы (2)


Я не думаю, что объекты xts поддерживают трехмерные массивы. Вам, вероятно, понадобится уродливое решение, подобное приведенному ниже. Помещение всего в массив приводит к числовым значениям. Но, по крайней мере, это сохраняет индекс даты, хотя и в другом формате, потому что массивы могут иметь только один тип данных.

require(quantmod)
getSymbols("GLD;SLV")
GLD <- cbind(index(GLD), as.matrix(GLD))
SLV <- cbind(index(SLV), as.matrix(SLV))
C <- array(,c(dim(GLD),2))
C[,,1] <- GLD
C[,,2] <- SLV
person Vincent    schedule 18.04.2011
comment
кажется, что дата сбрасывается, что важно для моих целей. Я добавлю больше кода выше, чтобы вы могли продублировать его, если хотите. - person Milktrader; 18.04.2011
comment
Смотрите мою правку. Боюсь, здесь не будет действительно чистого решения. Надеюсь, кто-то еще может подсказать что-то более приятное. - person Vincent; 18.04.2011
comment
Боюсь, вы можете быть правы, и нет никакого способа создать массив из объектов xts. Я надеялся, что массивы смогут отказаться от правила одного типа данных для объектов xts и зоопарка, потому что это именно то, что сделали матрицы. По сути, объект xts представляет собой матрицу, индексированную по времени, не так ли? - person Milktrader; 19.04.2011
comment
@Milktrader: да, объекты xts/zoo - это просто матрица с атрибутом индекса. - person Joshua Ulrich; 20.04.2011

Учитывая ваш последний комментарий, я думаю, вы могли бы сделать то, что хотите, одним из двух способов:

  1. используйте lapply со списком объектов xts
  2. использовать eapply с объектами xts, хранящимися в их собственной среде

Пример #2 с использованием getSymbols (обратите внимание, что eapply возвращает список):

library(quantmod)
myEnv <- new.env()
getSymbols("GLD;SLV", env=myEnv)
eapply(myEnv, function(x) head(Cl(x),3))
# $SLV
#            SLV.Close
# 2007-01-03    125.58
# 2007-01-04    125.80
# 2007-01-05    121.80
# 
# $GLD
#            GLD.Close
# 2007-01-03     62.28
# 2007-01-04     61.65
# 2007-01-05     60.17
person Joshua Ulrich    schedule 20.04.2011