2012-04-05 18 views
6

私は、多次元配列のdata.frameから取得するための、より多様な方法を模索しています。Rで多次元配列にdata.frameを取得するには?

私は、必要に応じてデータフレーム内の多くの変数から必要なだけ多くのディメンションを作成できるようにしたいと考えています。

現在、この方法は各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

あなたがトラブルやや微妙な理由でreshape2関数を適用を持っていたかもしれません。難しいのは、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

私はこれが正しいと思う:

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