2015-11-14 5 views
5

का उपयोग कर मैं एक नया (~ 1 दिन पुराना) आर उपयोगकर्ता हूं। मैं छः पक्षीय मरने के तीन फेंकने के सभी 216 परिणामों को उत्पन्न करने की कोशिश कर रहा हूं। बिंदु तब प्रत्येक ट्रिपल (कहें, अधिकतम अंकित मूल्य) में कुछ फ़ंक्शन लागू करना है। यही वह है जिसके साथ मैं आया हूं:उत्पन्न मैट्रिस/बाहरी

mat <- matrix(numeric(0), ncol=3) 
for (i in 1:6) { 
    for (j in 1:6) { 
     for (k in 1:6) { 
      mat <- rbind(mat, c(i, j, k)) 
     } 
    } 
} 

# find maximum of each outcome 
apply(mat, 1, max) 

क्या आर के साथ ऐसा करने का एक बेहतर और अधिक संक्षिप्त तरीका है? मैं outer इस तरह से उपयोग करने के लिए पसंद किया है जाएगा:

outer(1:6, outer(1:6, 1:6, max), max) 

लेकिन यह त्रुटि के साथ विफल बाहरी में

त्रुटि (1: 6, 1: 6, अधिकतम): मंद [उत्पाद 36] वस्तु की लंबाई से मेल नहीं खाते [1]

+0

'बाहरी()' तीन तर्कों/पैरामीटर है। आपके बाहरी 'बाहरी()' में केवल दो हैं। और फ़ंक्शन पैरामीटर के लिए चरित्र में नहीं डाला जाता है, 'अधिकतम'' 'अधिकतम' 'के अलावा कुछ और है। (कुछ फ़ंक्शंस, जिनमें फ़ंक्शन-पैरामीटर होता है, एक वर्ण स्ट्रिंग भी सहन करते हैं, लेकिन सभी नहीं) – jogo

+0

@jogo, खेद है कि गायब 1: 6 चीज एक टाइपो थी। लेकिन यह अभी भी काम नहीं करता है: 'बाहरी (बाहरी (1: 6, 1: 6, अधिकतम), 1: 6, अधिकतम)' एक ही त्रुटि को फेंकता है – Aky

+0

@Aky क्या आपने नीचे दिए गए समाधानों का परीक्षण किया है? – akrun

उत्तर

6

हम expand.grid का प्रयोग कर एक data.frame में संयोजन बनाने के लिए कर सकते हैं, matrix में बदल जाएंगे और पूर्वी वायु कमान की अधिकतम मूल्य प्राप्त library(matrixStats) से rowMaxs द्वारा एच पंक्ति।

library(matrixStats) 
rowMaxs(as.matrix(expand.grid(rep(list(1:6),3)))) 
#[1] 1 2 3 4 5 6 2 2 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 2 
#[38] 2 3 4 5 6 2 2 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 3 3 
#[75] 3 4 5 6 3 3 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 4 4 4 
#[112] 4 5 6 4 4 4 4 5 6 4 4 4 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 
#[149] 5 6 5 5 5 5 5 6 5 5 5 5 5 6 5 5 5 5 5 6 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 
#[186] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 

या हम expand.grid

do.call(pmax, expand.grid(rep(list(1:6),3))) 

साथ या के रूप में @Ben Bolker ने सुझाव दिया, हम भी MARGIN=1

apply(expand.grid(rep(list(1:6),3)),1,max) 

एक अन्य विकल्प outer है साथ apply उपयोग कर सकते हैं pmax उपयोग कर सकते हैंके साथ 0।

c(outer(1:6, outer(1:6, 1:6, FUN=pmax), FUN= pmax)) 
#[1] 1 2 3 4 5 6 2 2 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 2 
#[38] 2 3 4 5 6 2 2 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 3 3 
#[75] 3 4 5 6 3 3 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 4 4 4 
#[112] 4 5 6 4 4 4 4 5 6 4 4 4 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 
#[149] 5 6 5 5 5 5 5 6 5 5 5 5 5 6 5 5 5 5 5 6 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 
#[186] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 

या outerVectorize साथ d max

f1 <- function(x,y) max(x,y) 
c(outer(1:6, outer(1:6, 1:6, Vectorize(f1)), Vectorize(f1))) 
+0

धन्यवाद .. क्या आप समझा सकते हैं कि क्यों 'अधिकतम' विफल रहता है? – Aky

+0

@Aky यह काम करना चाहिए यदि आप 'वेक्टरिज़' 'अधिकतम' – akrun

+1

ठीक है, तो मैं पहले से वेक्टरिज़ में नहीं चला था। मैं बाद में इसे देख लूंगा। – Aky

संबंधित मुद्दे