2014-10-13 25 views
5

Her karakterden en az birini içeren sabit sayıda karakterden rasgele bir sıra oluşturmaya çalışıyorum. ensembleHer karakterden en az birini içeren sabit gruptan rastgele sıralama

m = letters[1:3] sahip Örneğin

I güvenilir

a 
a 
a 
a 
b 
c 
c 
c 
c 
a 

gibi, her m karakter en az birini içeren, N = 10 elemanları bir dizi yaratmak istiyoruz sample(n,N,replace=T) ile fakat bu şekilde

a 
a 
a 
a 
a 
c 
c 
c 
c 
a 
içermeyen

üretilebilir.

+0

Bu ona beni yendi http://stackoverflow.com/questions/25951206/r-sample-command-subject-to-a-constraint/25951492#25951492 –

cevap

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

birkaç fikirlerle yardımcı olabilir. Mantıksız bir şekilde yaygaraya benzemiyor. – thelatemail

+0

Başka bir mücevher cevabı –

+1

Bu çalışmanın nedeni (eğer birisi merak ediyorsa), bunun nedeni, dış örneklemin 'replace = TRUE' içermemesi ve aynı zamanda her zaman' x' içermesidir. benzersiz değerler) –

5

Josh O'Briens yanıtı, bunu yapmak için iyi bir yoldur ancak çok fazla giriş denetimi sağlamamaktadır. Yazmış olduğumdan beri cevabımı sunabilir. Bu hemen hemen aynı şeydir, ancak sadece benzersiz öğeleri göz önünde bulundurarak ve her birinin en az bir tanesini almanızı garanti edecek kadar benzersiz öğeler olduğundan emin olmak gibi şeyleri kontrol etmekle ilgilenir.

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

Güzel açıklama. – user3969377