2014-10-13 4 views
5

है, मैं प्रत्येक वर्ण में से कम से कम एक वर्ण वाले वर्णों की एक निश्चित संख्या से एक यादृच्छिक अनुक्रम उत्पन्न करने की कोशिश कर रहा हूं।निश्चित ensemble से यादृच्छिक अनुक्रम जिसमें प्रत्येक चरित्र में से कम से कम एक

उदाहरण के लिए

कलाकारों की टुकड़ी

m = letters[1:3] होने

मैं की तरह

a 
a 
a 
a 
b 
c 
c 
c 
c 
a 

मैंने कोशिश की, एन = 10 तत्वों है कि प्रत्येक m पात्रों में से कम से कम एक को शामिल का एक अनुक्रम बनाने के लिए चाहते हैं sample(n,N,replace=T) के साथ, लेकिन इस तरह एक अनुक्रम भी

a 
a 
a 
a 
a 
c 
c 
c 
c 
a 

उत्पन्न किया जा सकता है जिसमें b नहीं है।

+0

यह कुछ विचारों के साथ http://stackoverflow.com/questions/25951206/r-sample-command-subject-to-a-constraint/25951492#25951492 –

उत्तर

8
f <- function(x, n){ 
    sample(c(x, sample(m, n-length(x), replace=TRUE))) 
} 
f(letters[1:3], 5) 
# [1] "a" "c" "a" "b" "a" 
f(letters[1:3], 5) 
# [1] "a" "a" "b" "b" "c" 
f(letters[1:3], 5) 
# [1] "a" "a" "b" "c" "a" 
f(letters[1:3], 5) 
# [1] "b" "c" "b" "c" "a" 
+0

मदद कर सकता है यह करने के लिए मुझे हराया। बिना किसी झगड़े के तार्किक तरीके की तरह लगता है। – thelatemail

+0

फिर भी एक और मणि उत्तर –

+1

कारण यह काम कर रहा है (यदि कोई सोच रहा है) क्योंकि बाहरी 'नमूना' में' प्रतिस्थापन = TRUE' नहीं है, और साथ ही इसमें हमेशा 'x' होता है (सभी अद्वितीय मूल्य) –

5

जोश ओ'ब्राइन्स उत्तर ऐसा करने का एक अच्छा तरीका है लेकिन अधिक इनपुट जांच प्रदान नहीं करता है। चूंकि मैंने पहले ही लिखा है, यह मेरे उत्तर को भी प्रस्तुत कर सकता है। यह बहुत ही वही बात है लेकिन अनोखी वस्तुओं पर विचार करने जैसी चीजों की जांच करने और यह सुनिश्चित करने के लिए पर्याप्त अद्वितीय आइटम हैं कि आप प्रत्येक में से कम से कम एक प्राप्त करें।

at_least_one_samp <- function(n, input){ 
    # Only consider unique items. 
    items <- unique(input) 

    unique_items_count <- length(items) 
    if(unique_items_count > n){ 
    stop("Not enough unique items in input to give at least one of each") 
    } 

    # Get values for vector - force each item in at least once 
    # then randomly select values to get the remaining. 
    vals <- c(items, sample(items, n - unique_items_count, replace = TRUE)) 
    # Now shuffle them 
    sample(vals) 
} 

m <- c("a", "b", "c") 
at_least_one_samp(10, m) 
+0

अच्छा स्पष्टीकरण। – user3969377

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