2012-04-05 11 views
6

मैं डेटा.फ्रेम से एक बहुआयामी सरणी में जाने के लिए एक अधिक बहुमुखी तरीका ढूंढ रहा हूं।आर में एक multidimensional सरणी में data.frame कैसे प्राप्त करें?

मैं वांछित डेटा फ्रेम में कई चर से आवश्यक के रूप में कई आयाम बनाने में सक्षम होना चाहता हूं।

वर्तमान में, विधि को प्रत्येक डेटा.फ्रेम के अनुरूप बनाया जाना चाहिए, एक वेक्टर बनाने के लिए सबलेटिंग की आवश्यकता है।

मुझे प्लीयर में पिघल/कास्ट विधियों के साथ कुछ पसंद आएगा।

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 संख्यात्मक कॉलम होंगे और फिर शून्य या अधिक कारक कॉलम होंगे? – Tommy

उत्तर

7

आप मुसीबत कुछ हद तक एक सूक्ष्म कारण के लिए reshape2 कार्यों को लागू करने के भी पड़ा होगा। कठिनाई यह थी कि आपके डेटा.फ्रेम में कोई कॉलम नहीं है जिसका उपयोग आप आउटपुट सरणी के पहले आयाम के साथ तत्वों को व्यवस्थित करना चाहते हैं, यह निर्देशित करने के लिए किया जा सकता है।

नीचे, मैं स्पष्ट रूप से ऐसे कॉलम को जोड़ता हूं, इसे "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)) 
संबंधित मुद्दे