Tengo un marco de datos que quiero convertir a una de tres dimensiones de la matriz. Una de las columnas en el marco de datos debe servir como la agrupación de la variable para la división de la trama en 2d de las matrices que se pueden combinar en la matriz. En el siguiente mínimo ejemplo de trabajo, el marco de datos debe ser dividido en las matrices de la variable «i», luego se combinan en un 4x4x2 matriz. La solución debe ser práctico para grandes conjuntos de datos y lo ideal podría ser generalizado para convertir una estructura de datos en un n dimensiones de la matriz.

# Make reproducible 
set.seed(123)

df <- {
  data.frame(i=rep(1:2, each=4),
             x=rep(rep(0:1, each=2), 2),
             y=rep(rep(0:1, 2), 2),
             l=rnorm(8))
}

df
#   i x y           l
# 1 1 0 0 -0.56047565
# 2 1 0 1 -0.23017749
# 3 1 1 0  1.55870831
# 4 1 1 1  0.07050839
# 5 2 0 0  0.12928774
# 6 2 0 1  1.71506499
# 7 2 1 0  0.46091621
# 8 2 1 1 -1.26506123

Nota: sospecho que Hadley Wickham del plyr puede proporcionar la herramienta necesaria, tal vez daply?

  • Estás buscando split(df, df$i)?
  • Yo estaba buscando atar(split(df, df$i), junto=3). Estaban en la mitad del camino.
  • Publicado otra alternativa, sólo por la variedad.
InformationsquelleAutor Gregory | 2013-10-23

3 Comentarios

  1. 8

    Aquí es lo que probablemente iba a hacer:

    library(abind)
    abind(split(df, df$i), along=3)
    # , , 1
    # 
    #   i x y           l
    # 5 1 0 0 -0.56047565
    # 6 1 0 1 -0.23017749
    # 7 1 1 0  1.55870831
    # 8 1 1 1  0.07050839
    # 
    # , , 2
    # 
    #   i x y          l
    # 5 2 0 0  0.1292877
    # 6 2 0 1  1.7150650
    # 7 2 1 0  0.4609162
    # 8 2 1 1 -1.2650612
  2. 9

    Suena como que usted está buscando split:

    > split(df, df$i)
    $`1`
      i x y           l
    1 1 0 0 -0.56047565
    2 1 0 1 -0.23017749
    3 1 1 0  1.55870831
    4 1 1 1  0.07050839
    
    $`2`
      i x y          l
    5 2 0 0  0.1292877
    6 2 0 1  1.7150650
    7 2 1 0  0.4609162
    8 2 1 1 -1.2650612

    Esto se traduce en una list de dos data.frames, separadas por la «i» de la columna.


    Para obtener una array, tienes Josh respuesta, o puede utilizar simplify2array de la base R:

    > simplify2array(by(df, df$i, as.matrix))
    , , 1
    
      i x y           l
    1 1 0 0 -0.56047565
    2 1 0 1 -0.23017749
    3 1 1 0  1.55870831
    4 1 1 1  0.07050839
    
    , , 2
    
      i x y          l
    1 2 0 0  0.1292877
    2 2 0 1  1.7150650
    3 2 1 0  0.4609162
    4 2 1 1 -1.2650612
  3. 4

    Tal vez estoy leyendo la pregunta equivocada, pero el MWE describe un 2x2x2 matriz (x, y, i (a.k.una. z)). El actual respuestas parecen ofrecer soluciones que proporcionan las matrices de datos.marcos en lugar de matrices de matrices 2D (por OPERACIÓN). array() convertir un data.frame a una matriz de n dimensiones de las matrices:

    dfa <- array(data = df$l, 
                 dim=c(length(unique(df$x)), 
                       length(unique(df$y)), 
                       length(unique(df$i))), 
                 dimnames=list(unique(df$x), unique(df$y), unique(df$i))
                )
    dfa
    > dfa
    , , 1
    
               0          1
    0 -0.5604756 1.55870831
    1 -0.2301775 0.07050839
    
    , , 2
    
              0          1
    0 0.1292877  0.4609162
    1 1.7150650 -1.2650612
    • Buen punto @Brian D. Las respuestas anteriores no son realmente matrices.

Dejar respuesta

Please enter your comment!
Please enter your name here