2012-04-05 20 views
6

Sto cercando un modo più versatile per passare da un data.frame a un array multidimensionale.Come ottenere un data.frame in una matrice multidimensionale in R?

Mi piacerebbe essere in grado di creare quante più dimensioni necessarie da quante più variabili nel frame di dati, come desiderato.

Attualmente, il metodo deve essere adattato a ogni data.frame, richiede il subaffitto per formare un vettore.

Mi piacerebbe qualcosa lungo i metodi di fusione/fusione in 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

... avresti sempre 2 colonne numeriche e quindi zero o più colonne di fattori? – Tommy

risposta

7

Si può avere avuto problemi applicando le reshape2 funzioni per un motivo un po 'sottile. La difficoltà era che il tuo data.frame non ha una colonna che può essere usata per indirizzare come vuoi disporre gli elementi lungo la prima dimensione di un array di output.

In basso, aggiungo esplicitamente una colonna di questo tipo, chiamandola "row". Con esso, è possibile utilizzare le funzioni espressive acast() o dcast() per ridisporre i dati nel modo desiderato.

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

penso che questo sia giusto:

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