आर

2011-12-01 21 views
5

में एक यादृच्छिक वेक्टर द्वारा निर्दिष्ट कॉलम का चयन करना मेरे पास एक बड़ा मैट्रिक्स है जिसमें से मैं यादृच्छिक रूप से एक छोटे मैट्रिक्स को निकालना चाहता हूं। (मैं इस 1000 बार क्या करना चाहते हैं, तो अंत में यह पाश के लिए एक में हो जाएगा।) उदाहरण है कि मैं इस 9x9 मैट्रिक्स है के लिए कहते हैं:आर

mat=matrix(c(0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1, 
      0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0, 
      1,0,1,0,0,0,0,0,1,0,1,0,0,0,1), nrow=9) 

इस मैट्रिक्स से, मैं एक यादृच्छिक 3x3 सबसेट चाहते हैं। चाल यह है कि मैं नहीं चाहता कि अंतिम मैट्रिक्स में कोई पंक्ति या कॉलम रकम 0 हो। एक और महत्वपूर्ण बात यह है कि मुझे अंतिम मैट्रिक्स में पंक्तियों और स्तंभों की मूल संख्या जानने की आवश्यकता है। इसलिए, यदि मैं पंक्तियों 4, 5, और 7 और कॉलम 1, 3, और 8 को यादृच्छिक रूप से चुनता हूं, तो मैं उन पहचानकर्ताओं को अंतिम मैट्रिक्स में आसानी से एक्सेस करना चाहता हूं।

यहां तक ​​कि मैंने अभी तक किया है।

पहले, मैं पंक्ति संख्या और स्तंभ संख्या का एक वेक्टर पैदा करते हैं। मैं इन्हें पूरे मैट्रिक्स से जुड़े रखने की कोशिश कर रहा हूं।

r.num<-seq(from=1,to=nrow(mat),by=1)  #vector of row numbers 
c.num<-seq(from=0, to=(ncol(mat)+1),by=1) #vector of col numbers (adj for r.num) 

mat.1<-cbind(r.num,mat) 
mat.2<-rbind(c.num,mat.1) 

अब मेरे पास पहचानकर्ताओं के साथ 10x10 मैट्रिक्स है। मैं एक यादृच्छिक वेक्टर बनाकर और मैट्रिक्स को सबसेट करके अपनी पंक्तियों का चयन कर सकता हूं।

rand <- sample(r.num,3) 
temp1 <- rbind(mat.2[1,],mat.2[rand,])  #keep the identifier row 

यह अच्छी तरह से काम करता है! अब मैं यादृच्छिक रूप से 3 कॉलम चुनना चाहता हूं। यह वह जगह है जहां मैं परेशानी में भाग रहा हूं। मैंने इसे वैसे ही करने की कोशिश की।

rand2 <- sample(c.num,3) 
temp2 <- cbind(temp1[,1],temp1[,rand2]) 

समस्या यह है कि मैं कुछ पंक्ति और स्तंभ रकम हैं कि अंत है 0. मैं पहली बार 0 करने के लिए कॉलम उस राशि को खत्म कर सकते हैं।

temp3 <- temp1[,which(colSums(temp1[2:nrow(temp1),])>0)] 
cols <- which(colSums(temp1[2:nrow(temp1),2:ncol(temp1)])>0) 
rand3 <- sample(cols,3) 
temp4 <- cbind(temp3[,1],temp3[,rand3]) 

लेकिन मैं एक त्रुटि संदेश के साथ समाप्त होता हूं। किसी कारण से, आर इस तरह मैट्रिक्स को सबसेट करना पसंद नहीं करता है।

तो मेरा सवाल यह है कि, शून्य कॉलम हटा दिए जाने के बाद यादृच्छिक वेक्टर "रैंड 3" द्वारा मैट्रिक्स को सबसेट करने का एक बेहतर तरीका है या फिर तीन पूरक पंक्तियों और स्तंभों को यादृच्छिक रूप से चुनने का एक बेहतर तरीका है कोई भी 0 के बराबर नहीं है?

आपकी मदद के लिए बहुत बहुत धन्यवाद!

+0

अंतिम 1000 सबसेट मैट्रिक्स अद्वितीय होना चाहिए? –

+0

यह महत्वपूर्ण नहीं है। मैं जिस मूल मैट्रिक्स से नमूना कर रहा हूं वह 1174 पंक्तियां और 455 कॉलम है, इसलिए मैं एक प्रतिनिधि नमूना प्राप्त करना चाहता हूं। हालांकि, मुझे यकीन है कि संभावनाओं की एक सीमित संख्या है। एकमात्र परेशानी होगी यदि अद्वितीय सबमिशन में से किसी एक की तरफ नमूना पूर्वाग्रह होता है। – Laura

उत्तर

4

अगर मैं आपकी समस्या को समझ में आया, मुझे लगता है कि यह काम करेगा:

mat=matrix(c(0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1, 
      0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0, 
      1,0,1,0,0,0,0,0,1,0,1,0,0,0,1), nrow=9) 

smallmatrix = matrix(0,,nrow=3,ncol=3) 

while(any(apply(smallmatrix,2,sum) ==0) | any(apply(smallmatrix,1,sum) ==0)){ 
     cols = sample(ncol(mat),3) 
     rows= sample(nrow(mat),3) 
     smallmatrix = mat[rows,cols] 
} 

colnames(smallmatrix) = cols 
rownames(smallmatrix) = rows 
+2

हाहा मैं लगभग एक ही जवाब पोस्ट करना चाहता था लेकिन आप मुझे इसे हराया! मैं केवल यह मूल्यांकन करने में सोचता हूं कि पंक्ति और कॉलम रकम शून्य हैं, तो 'rowSums' और' colums 'का उपयोग करना तेज़ है:' कोई भी (colSums (smallmatrix) == 0) | कोई भी (rowSums (smallmatrix) == 0) ' –

+0

ओह, मैंने अभी देखा है कि कुछ पंक्तियां हैं जो इस विधि का उपयोग करके शून्य राशि के साथ समाप्त होती हैं। कोई अन्य विचार? – Laura

+1

मैंने अभी इसे ठीक किया है। @SachaEpskamp इसे शुरुआत से ही मिला। मैंने नोटिस नहीं किया कि प्रतिबंध भी पंक्तियों पर लागू होता है। तो बस एक या थोड़ी देर में जोड़ रहा है। – aatrujillob