2012-03-04 14 views
6

मैंने मैट्रिक्स उत्पन्न करने के लिए नीचे दिया गया कोड लिखा है, जो मेरे लिए है, एक जटिल जटिल पैटर्न है। इस मामले में मैंने निर्धारित किया कि परीक्षण और त्रुटि से समाप्त मैट्रिक्स में 136 पंक्तियां हैं।आर: पंक्तियों की अज्ञात संख्या के साथ एक मैट्रिक्स बनाना

मैं पहले से मैट्रिक्स पंक्तियों की संख्या की गणना करने के लिए एक फ़ंक्शन लिख सकता हूं, लेकिन फ़ंक्शन थोड़ा जटिल होगा। इस उदाहरण में मैट्रिक्स में पंक्तियों की संख्या = ((4 * 3 + 1) + (3 * 3 + 1) + (2 * 3 + 1) + (1 * 3 + 1)) * 4.

क्या मैट्रिक्स कथन में पंक्तियों की संख्या को हार्ड-वायरिंग के बिना आर में मैट्रिस बनाने का कोई आसान और कारगर तरीका है? दूसरे शब्दों में, क्या आर-लूप का उपयोग करते समय आर को बस एक मैट्रिक्स में पंक्ति जोड़ने की एक आसान तरीका है?

मैंने एक समाधान प्रस्तुत किया है जो प्रत्येक पास लूप के माध्यम से रिबाइंड को नियोजित करता है, लेकिन ऐसा लगता है कि यह थोड़ा आसान है और मैं सोच रहा था कि क्या कोई आसान समाधान हो सकता है।

क्षमा करें यदि यह प्रश्न पहले के प्रश्न के साथ अनावश्यक है। मैं इस साइट पर खोज सुविधा का उपयोग करके या इंटरनेट सर्च इंजन का उपयोग कर एक समान प्रश्न का पता नहीं लगा सका, हालांकि मुझे लगता है कि मुझे अतीत में एक समान प्रश्न मिला है।

नीचे उदाहरण कोड के 2 सेट हैं, एक rbind का उपयोग कर रहा है और दूसरा जहां मैंने पहले से ही nrow = 136 सेट करने के लिए परीक्षण और त्रुटि का उपयोग किया था।

किसी भी सुझाव के लिए धन्यवाद।

v1  <- 5 
v2  <- 2 
v3  <- 2 
v4  <- (v1-1) 

my.matrix <- matrix(0, nrow=136, ncol=(v1+4)) 

i = 1 

for(a in 1:v2) { 
    for(b in 1:v3) { 
    for(c in 1:v4) { 
     for(d in (c+1):v1) { 

     if(d == (c+1)) l.s = 4 
     else   l.s = 3 

     for(e in 1:l.s) { 

      my.matrix[i,c] = 1 

      if(d == (c+1)) my.matrix[i,d] = (e-1) 
      else   my.matrix[i,d] = e 

      my.matrix[i,(v1+1)] = a 
      my.matrix[i,(v1+2)] = b 
      my.matrix[i,(v1+3)] = c 
      my.matrix[i,(v1+4)] = d 

      i <- i + 1 

     } 
     } 
    } 
    } 
} 

my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4)) 
my.matrix3 <- matrix(0, nrow=1, ncol=(v1+4)) 

i = 1 

for(a in 1:v2) { 
    for(b in 1:v3) { 
    for(c in 1:v4) { 
     for(d in (c+1):v1) { 

     if(d == (c+1)) l.s = 4 
     else   l.s = 3 

     for(e in 1:l.s) { 

      my.matrix2[1,c] = 1 

      if(d == (c+1)) my.matrix2[1,d] = (e-1) 
      else   my.matrix2[1,d] = e 

      my.matrix2[1,(v1+1)] = a 
      my.matrix2[1,(v1+2)] = b 
      my.matrix2[1,(v1+3)] = c 
      my.matrix2[1,(v1+4)] = d 

      i <- i+1 

      if(i == 2) my.matrix3 <- my.matrix2 
      else  my.matrix3 <- rbind(my.matrix3, my.matrix2) 

      my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4)) 

     } 
     } 
    } 
    } 
} 

all.equal(my.matrix, my.matrix3) 
+3

यह 'द आर इन्फर्नो' के मंडल 2 का विषय है http://www.burns-stat.com/pages/Tutor/R_inferno.pdf आप निरंतर rbinding या cbinding से बचने के लिए सही हैं। –

उत्तर

6

आप मैट्रिक्स के आकार, आप एक मैट्रिक्स काफी बड़ी सभी डेटा

my.matrix <- matrix(0, nrow=v1*v2*v3*v4*4, ncol=(v1+4)) 

पकड़ और अंत में यह काटना बना सकते हैं पर कुछ ऊपरी बाध्य है।

my.matrix <- my.matrix[1:(i-1),] 
2

यह करने के लिए यह सामान्य रूप है। एक data.frame को matrix कन्वर्ट: आप अपने समस्या

matrix <- NULL 
for(...){ 
... 
matrix <- rbind(matriz,vector) 
} 

जहां वेक्टर पंक्ति तत्वों

+0

rbind को समान आयाम रखने के लिए अपने दो तर्कों की आवश्यकता है –

1

मैं आज इस समाधान पर ठोकर खाई शामिल करने के लिए इसे अनुकूलित कर सकते हैं। चूंकि for-loop द्वारा नई पंक्तियों की आवश्यकता होती है, तो उन पंक्तियां स्वचालित रूप से data.frame में जोड़ दी जाती हैं। फिर यदि आप चाहें तो data.frame को matrix पर अंत में परिवर्तित कर सकते हैं। मुझे यकीन नहीं है कि यह rbind के पुनरावर्तक उपयोग के समान कुछ बनाता है या नहीं। शायद यह data.frames के साथ बहुत धीमा हो जाता है। मुझे नहीं पता।

my.data <- matrix(0, ncol = 3, nrow = 2) 
my.data <- as.data.frame(my.data) 

j <- 1 

for(i1 in 0:2) { 
    for(i2 in 0:2) { 
      for(i3 in 0:2) { 

        my.data[j,1] <- i1 
        my.data[j,2] <- i2 
        my.data[j,3] <- i3 

        j <- j + 1 

      } 
    } 
} 

my.data 
my.data <- as.matrix(my.data) 
dim(my.data) 
class(my.data) 

संपादित करें: 27 जुलाई, 2015

तुम भी पहले matrix बयान नष्ट कर सकते हैं, बनाने के एक खाली data.frame तो अंत में एक matrix को data.frame कन्वर्ट:

my.data <- data.frame(NULL,NULL,NULL) 

j <- 1 

for(i1 in 0:2) { 
    for(i2 in 0:2) { 
      for(i3 in 0:2) { 

        my.data[j,1] <- i1 
        my.data[j,2] <- i2 
        my.data[j,3] <- i3 

        j <- j + 1 
      } 
    } 
} 

my.data 
my.data <- as.matrix(my.data) 
dim(my.data) 
class(my.data) 
संबंधित मुद्दे