¿Cómo fusiono una gran lista de objetos XTS a través de bucle / función en R?

StackOverflow https://stackoverflow.com/questions/6379778

  •  28-10-2019
  •  | 
  •  

Pregunta

Tengo un bucle que extrae ~ 200 tiempos de tiempo individuales haciendo llamadas a una API.

El bucle genera las veces como los objetos XTS (library(xts)) en el entorno global con el sufijo ".oc". Entonces tengo 200 objetos 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. Es decir, terminarí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 Timeseries, simplemente escribiría:

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

Pero obviamente, esto no es práctico con 200 objetos individuales, por lo que me gustaría escribir un bucle para aplastar todos estos objetos como lo hace "Fusionar".

Bastante fácil de acceder a las variables para el bucle a través de for i in length(ls(pattern="*.oc")){ Pero simplemente no puedo entender el resto del bucle. He probado CBind, pero parece que no puedo hacerlo bien.

Cualquier ayuda muy apreciada

¿Fue útil?

Solución

Esto se puede lograr obteniendo un vector de caracteres de todos los objetos con nombres que terminan en .oc, ponerlos en una lista, luego llamar merge a través de do.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

Usar este método sería más fácil si cargó los objetos XTS en una lista (objList) como los recibió de la API. Entonces solo necesitarías do.call(merge, objList).

Otros consejos

Un bucle como este debería funcionar. Sin embargo, siempre una buena idea para 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])
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top