2012-04-05 10 views
6

Tôi đang tìm một cách linh hoạt hơn để lấy dữ liệu từ một khung dữ liệu đến một mảng đa chiều.Làm thế nào để lấy một data.frame vào một mảng đa chiều trong R?

Tôi muốn có thể tạo nhiều thứ nguyên nếu cần từ nhiều biến trong khung dữ liệu như mong muốn.

Hiện tại, phương pháp này phải được điều chỉnh cho từng data.frame, yêu cầu đặt cược con để tạo thành vectơ.

Tôi rất thích điều gì đó theo các phương pháp tan chảy/đúc trong 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

... bạn luôn có 2 cột số và sau đó là 0 hoặc nhiều cột yếu tố? – Tommy

Trả lời

7

Bạn có thể gặp khó khăn áp dụng reshape2 chức năng vì một lý do hơi tế nhị. Khó khăn là data.frame của bạn không có cột có thể được sử dụng để chỉ đạo cách bạn muốn sắp xếp các phần tử dọc theo thứ nguyên đầu tiên của một mảng đầu ra.

Dưới đây, tôi thêm một cột như vậy, gọi nó là "row". Với nó tại chỗ, bạn có thể sử dụng các hàm acast() hoặc dcast() biểu cảm để định hình lại dữ liệu theo bất kỳ cách nào bạn chọn.

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

Tôi nghĩ rằng đây là đúng:

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