2012-04-05 30 views
6

Estoy buscando una forma más versátil para pasar de un data.frame a un array multidimensional.¿Cómo obtener un data.frame en una matriz multidimensional en R?

Me gustaría ser capaz de crear tantas dimensiones como sea necesario a partir de tantas variables en el marco de datos como desee.

Actualmente, el método debe adaptarse a cada data.frame, requiere subarriendo para formar un vector.

Me encantaría algo a lo largo de los métodos de fusión/fundición en plyr.

data<-data.frame(coord.name=rep(1:10, 2), 
      x=rnorm(20), 
      y=rnorm(20), 
      ID=rep(c("A","B"), each=10)) 


    data.array<-array(dim=c(10, 2, length(unique(data$ID)))) 

    for(i in 1:length(unique(data$ID))){ 
     data.array[,1,i]<-data[data$ID==unique(data$ID)[i],"x"] 
     data.array[,2,i]<-data[data$ID==unique(data$ID)[i],"y"] 
    } 

data.array 
, , 1 

     [,1] [,2] 
[1,] 1 1 
[2,] 3 3 
[3,] 5 5 
[4,] 7 7 
[5,] 9 9 
[6,] 1 1 
[7,] 3 3 
[8,] 5 5 
[9,] 7 7 
[10,] 9 9 

, , 2 

     [,1] [,2] 
[1,] 2 2 
[2,] 4 4 
[3,] 6 6 
[4,] 8 8 
[5,] 10 10 
[6,] 2 2 
[7,] 4 4 
[8,] 6 6 
[9,] 8 8 
[10,] 10 10 
+0

... ¿Tendría siempre 2 columnas numéricas y luego cero o más columnas de factores? – Tommy

Respuesta

7

Es posible que haya tenido problemas para aplicar las reshape2 funciones por una razón un tanto sutil. La dificultad fue que su data.frame no tiene una columna que pueda usarse para dirigir cómo desea organizar los elementos a lo largo de la primera dimensión de una matriz de salida.

A continuación, agrego explícitamente dicha columna, llamándola "row". Con esto en su lugar, puede usar las expresivas funciones acast() o dcast() para remodelar los datos de la forma que elija.

library(reshape2) 

# Use this or some other method to add a column of row indices. 
data$row <- with(data, ave(ID==ID, ID, FUN = cumsum)) 

m <- melt(data, id.vars = c("row", "ID")) 
a <- acast(m, row ~ variable ~ ID) 

a[1:3, , ] 
# , , A 
# 
# x y 
# 1 1 1 
# 2 3 3 
# 3 5 5 
# 
# , , B 
# 
# x y 
# 1 2 2 
# 2 4 4 
# 3 6 6 
4

creo que esto es correcto:

array(unlist(lapply(split(data, data$ID), function(x) as.matrix(x[ , c("x", "y")]))), c(10, 2, 2)) 
Cuestiones relacionadas