2012-04-05 5 views
6

data.frame에서 다차원 배열로 변환하는보다 다양한 방법을 찾고 있습니다.data.frame을 R의 다차원 배열로 가져 오는 방법은 무엇입니까?

원하는대로 데이터 프레임에 많은 변수에서 필요한만큼의 차원을 만들 수 있기를 바랍니다.

현재이 방법은 각 data.frame에 맞게 조정되어야하며 벡터를 만들기 위해 서브렛을 사용해야합니다.

나는 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

... 항상 2 개의 숫자 열이 있고 0 개 이상의 계수 열이 있습니까? – Tommy

답변

7

. 어려움은 data.frame에 출력 배열의 첫 번째 차원을 따라 요소를 정렬하는 방법을 지시하는 데 사용할 수있는 열이 없다는 것입니다.

아래에 명시 적으로이 열을 추가하여 "row"이라고합니다. 이를 사용하면 표현형 acast() 또는 dcast() 함수를 사용하여 원하는 방식으로 데이터를 다시 만들 수 있습니다.

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

내가이 잘 생각 : 당신은 문제가 다소 미묘한 이유로 reshape2 기능을 적용했다 수도

array(unlist(lapply(split(data, data$ID), function(x) as.matrix(x[ , c("x", "y")]))), c(10, 2, 2)) 
관련 문제