2012-04-05 18 views
6

Szukam bardziej uniwersalnego sposobu na przejście z data.frame do tablicy wielowymiarowej.Jak zdobyć data.frame w wielowymiarowej tablicy w R?

Chciałbym móc tworzyć tyle wymiarów, ile potrzeba, z dowolnej liczby zmiennych w ramce danych.

Obecnie metoda musi być dostosowana do każdego elementu data.frame, wymaga podnajmu w celu utworzenia wektora.

Uwielbiam coś wzdłuż metod topienia/odlewania w 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

... czy zawsze masz 2 kolumny numeryczne, a następnie zero lub więcej kolumn współczynników? – Tommy

Odpowiedz

7

Możesz mieć problemy ze stosowaniem tych reshape2 funkcje nieco subtelnej przyczyny. Trudność polegała na tym, że twoja data.frame nie ma kolumny, której można użyć do kierowania tym, jak chcesz rozmieścić elementy wzdłuż pierwszego wymiaru tablicy wyjściowej.

Poniżej wyraźnie dodaję taką kolumnę, nazywając ją "row". Dzięki temu możesz użyć funkcji ekspresji acast() lub , aby zmienić kształt danych w dowolny sposób.

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

myślę, że ma rację:

array(unlist(lapply(split(data, data$ID), function(x) as.matrix(x[ , c("x", "y")]))), c(10, 2, 2)) 
Powiązane problemy