2012-03-01 31 views
9

Quiero ejecutar una función en todos los períodos de una matriz xts. Aplicar() es muy rápido, pero la matriz devuelta ha transpuesto dimensiones en comparación con el objeto original:¿Por qué apply() devuelve una matriz xts transpuesta?

> dim(myxts) 
[1] 7429 48 
> myxts.2 = apply(myxts, 1 , function(x) { return(x) }) 
> dim(myxts.2) 
[1] 48 7429 
> str(myxts) 
An 'xts' object from 2012-01-03 09:30:00 to 2012-01-30 16:00:00 containing: 
    Data: num [1:7429, 1:48] 4092500 4098500 4091500 4090300 4095200 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:48] "Open" "High" "Low" "Close" ... 
    Indexed by objects of class: [POSIXlt,POSIXt] TZ: 
    xts Attributes: 
NULL 
> str(myxts.2) 
num [1:48, 1:7429] 4092500 4098500 4091100 4098500 0 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:48] "Open" "High" "Low" "Close" ... 
    ..$ : chr [1:7429] "2012-01-03 09:30:00" "2012-01-03 09:31:00" "2012-01-03 09:32:00" "2012-01-03 09:33:00" ... 
> nrow(myxts) 
[1] 7429 
> head(myxts) 
         Open High  Low Close 
2012-01-03 09:30:00 4092500 4098500 4091100 4098500 
2012-01-03 09:31:00 4098500 4099500 4092000 4092000 
2012-01-03 09:32:00 4091500 4095000 4090000 4090200 
2012-01-03 09:33:00 4090300 4096400 4090300 4094900 
2012-01-03 09:34:00 4095200 4100000 4095200 4099900 
2012-01-03 09:35:00 4100000 4100000 4096500 4097500 

¿Cómo puedo conservar myxts dimensiones?

+1

Un pequeño fragmento de sus datos sería útil para que podamos volver a crear el problema. – Justin

Respuesta

15

Eso es lo que apply está documentado para hacer. De ?apply:

Valor:

If each call to ‘FUN’ returns a vector of length ‘n’, then ‘apply’ 
returns an array of dimension ‘c(n, dim(X)[MARGIN])’ if ‘n > 1’. 

En su caso, 'n'=48 (porque estás bucle sobre las filas), por lo que se apply devolver una matriz de dimensión c(48, 7429).

También tenga en cuenta que myxts.2 es no un objeto xts. Es una matriz regular. Usted tiene un par de opciones:

  1. transponer los resultados de apply antes de volver a crear sus XTS objetar:

    data(sample_matrix) 
    myxts <- as.xts(sample_matrix) 
    dim(myxts) # [1] 180 4 
    myxts.2 <- apply(myxts, 1 , identity) 
    dim(myxts.2) # [1] 4 180 
    myxts.2 <- xts(t(apply(myxts, 1 , identity)), index(myxts)) 
    dim(myxts.2) # [1] 180 4 
    
  2. Vectorize su función por lo que funciona en todas las filas de una XTS objeto y devuelve un objeto xts. Entonces no tiene que preocuparse sobre apply en absoluto.

Finalmente, comience a proporcionar ejemplos reproducibles. No es tan difícil y hace que sea mucho más fácil para las personas ayudar. He proporcionado un ejemplo anterior y espero que pueda usarlo en sus siguientes preguntas.

+0

Si quiero ir a la opción 2, ¿cómo puedo pasar cada fila completa a mi función de procesamiento? Por ejemplo, myxts $ result = myxts $ Close - myxts $ Open funciona para campos específicos, pero ¿qué ocurre si quiero llamar a una función que pasa en la fila completa como uno de los parámetros? –

+1

@RobertKubrick: No puedo responder eso sin ver tu función. Puede o no ser posible. Como mínimo, puede ajustar su función de procesamiento en otra función que tenga la opción 1. No se vectorizará realmente, pero será más claro si lo va a hacer mucho. –

+0

La solución 1 es muy rápida en comparación con un bucle for. Me gustaría entender por qué, pero tal vez esa es una pregunta diferente. –

Cuestiones relacionadas