2011-06-16 5 views
8

Tengo un bucle que extrae ~ 200 timeseries individuales haciendo llamadas a una API.¿Cómo puedo fusionar una gran lista de objetos xts mediante bucle/función en R?

El ciclo emite las series temporales como objetos xts (library(xts)) en el entorno global con el sufijo ".oc". Así que tengo 200 objetos de xts de la forma "ABC.oc", "ABD.oc" etc. Cada objeto contiene 1000 filas de datos.

Lo que me gustaría hacer es escribir un bucle (o usar una función apropiada) que tome todos los objetos "* .oc" y los fusione por columna. IE acabaría con:

Date   ABC.oc ABD.oc -> 200 columns like this 
2011-01-01  10   10 
2011-01-02  20   20 
2011-01-03  30   30 
2011-01-04  40   40 
2011-01-05  50   50 

Con una breve lista de series de tiempo, que acaba de escribir:

m <- merge(ABC.oc,ABD.oc,all=FALSE) 

Pero obviamente esto no es práctico con 200 objetos individuales, así que me gustaría escribir una para romper todos estos objetos juntos como lo hace "fusionar".

Lo suficientemente fácil para acceder a las variables para el bucle a través de for i in length(ls(pattern="*.oc")){, pero simplemente no se puede entender el resto del bucle. He intentado cbind, pero parece que no puede hacerlo bien.

Cualquier ayuda muy apreciada

Respuesta

13

Esto se puede lograr mediante la obtención de un vector de caracteres de todos los objetos con nombres que terminan en .oc, poniéndolos en una lista, a continuación, llamar a través de mergedo.call.

# Make up some data 
set.seed(21) 
x.oc <- xts(rnorm(10), Sys.Date()-10:1) 
y.oc <- xts(rnorm(10), Sys.Date()-10:1) 
z.oc <- xts(rnorm(10), Sys.Date()-10:1) 
x <- y <- z <- 1:10 

objNames <- ls(pattern="*oc$") # object names 
objList <- lapply(objNames, get) # list of objects 
names(objList) <- objNames  # assign names to list 
do.call(merge, objList)   # merge all objects in list 

uso de este método sería más fácil si ha cargado los objetos XTS en una lista (objList) a medida que los recibió de la API. Entonces solo necesitaría do.call(merge, objList).

+0

Por lo que puedo decir, 'x <- y <- z <- 1: 10' no es necesario aquí. – jbaums

+0

@jbaums: Representan objetos potenciales en el entorno global que no coinciden con el patrón de objetos deseados. –

+0

Ahh, eso tiene sentido, gracias. :) – jbaums

2

Un bucle como este debería funcionar. Siempre es una buena idea inicializarlo primero.

library(xts) 

m <- xts(matrix(vector(length=length(ls(pattern="*.oc")) * 
    nrow(get(ls(pattern="*.oc")[1]), ncol=nrow(get(ls(pattern="*.oc")[1])), 
    order.by=index(get(ls(pattern="*.oc")[1])) 

for (i in 1:length(ls(pattern="*.oc"))) { 
    m[, i] <- get(ls(pattern="*.oc")[i]) 
} 
+0

Esto es genial, lo intentaré. Si quisiera generalizar la longitud de 1000 filas a una longitud arbitraria/dinámica, ¿qué sugeriría? –

+0

@ n.e.w las ediciones que hice generalizarán tanto el número de objetos como el número de filas que tienen – wkmor1

Cuestiones relacionadas