2014-10-13 15 views
5

Próbuję wygenerować losową sekwencję ze stałej liczby znaków, która zawiera co najmniej jedną z każdej litery.Losowa sekwencja ze stałego zestawu, która zawiera co najmniej jedną z postaci

przykładowo o Zespół

m = letters[1:3]

ja chce utworzyć sekwencję N = 10 elementów, które zawierają co najmniej jeden z każdego m postaci, jak

a 
a 
a 
a 
b 
c 
c 
c 
c 
a 

że próbuje z sample(n,N,replace=T), ale w ten sposób również sekwencja taka jak

a 
a 
a 
a 
a 
c 
c 
c 
c 
a 
Można wygenerować

, która nie zawiera b.

+0

To może pomóc z kilku pomysłów http://stackoverflow.com/questions/25951206/r-sample-command-subject-to-a-constraint/25951492#25951492 –

Odpowiedz

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

beat mnie do niego. Wydaje się logicznym sposobem bez większego zamieszania. – thelatemail

+0

Jeszcze jeden klejnot odpowiedzi –

+1

Powodem tego działa (jeśli ktoś się zastanawia) jest to, że zewnętrzny 'sample' nie zawiera w sobie' replace = TRUE', a jednocześnie zawsze zawiera 'x' (wszystkie unikalne wartości) –

5

Odpowiedź Josh'a O'Briensa to dobry sposób na zrobienie tego, ale nie zapewnia dużego sprawdzenia danych wejściowych. Ponieważ już napisałem, równie dobrze mogłabym przedstawić moją odpowiedź. To prawie to samo, ale dba o to, aby sprawdzać rzeczy, takie jak tylko uwzględnianie wyjątkowych przedmiotów i upewnianie się, że jest wystarczająco dużo unikalnych przedmiotów, aby zagwarantować, że otrzymasz co najmniej jeden z nich.

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

Niezłe wyjaśnienie. – user3969377

Powiązane problemy