Дело в том, что если порядок имеет значение, то вам нужны перестановки, а не комбинации. Перестановки обычно взрываются быстро и становятся неуправляемыми. Я уверен, что это крайне неэффективно, но, похоже, это работает.
balls<-c(rep("R",3), rep("G",2),"W")
permn <- function(x, n) {
if (n<1) return(vector(class(x)))
do.call(rbind, lapply(1:length(x), function(i) {
cbind(x[i], permn(x[-i], n-1))
})
)
}
x <- permn(balls, 3)
unique(sort(apply(x, 1, paste, collapse="")))
И это возвращает
[1] "GGR" "GGW" "GRG" "GRR" "GRW" "GWG" "GWR" "RGG" "RGR" "RGW" "RRG"
[12] "RRR" "RRW" "RWG" "RWR" "WGG" "WGR" "WRG" "WRR"
по желанию.
Функция работает рекурсивно. Вы передаете список значений (x
) и сколько предметов вы хотите выбрать из этого списка (n
). Если вы выбираете хотя бы одно значение, тогда мы настраиваем цикл, посредством которого мы выбираем каждый из элементов. Затем, после того, как мы выбрали одно значение, нам нужно еще выбрать n-1
из оставшихся предметов. Таким образом, мы снова вызываем функцию, на этот раз удаляя только что выбранное значение и уменьшая количество элементов, которые нам нужно выбрать.
До этого момента мы фактически игнорировали значения в наборе (мы предположили, что они все уникальны). Но так как в этом случае все шары определенного цвета неразличимы, нам нужно разрушить наши результаты. Поскольку permn
фактически возвращает матрицу, мы сведем строки из вектора, например c("G","G","R")
, к строке "GGR"
, а затем просто возьмем уникальные значения.
Конечно, не каждый результат одинаково вероятен. Если мы хотим, чтобы увидеть, как часто они происходят, вы могли бы сделать
sort(prop.table(table(apply(x, 1, paste, collapse=""))))
которые также вычислить вероятности каждого из элементов в выборочном пространстве
GGW GWG WGG GGR GRG GRW
0.01666667 0.01666667 0.01666667 0.05000000 0.05000000 0.05000000
GWR RGG RGW RRR RRW RWG
0.05000000 0.05000000 0.05000000 0.05000000 0.05000000 0.05000000
RWR WGR WRG WRR GRR RGR
0.05000000 0.05000000 0.05000000 0.05000000 0.10000000 0.10000000
RRG
0.10000000
Это потянет от правильного распределения, но он не обязательно будет генерировать пространство выборки по запросу. (Если вы не запускаете его много, много раз и не берете уникальные значения, наблюдаемые, но останавливаясь до бесконечности, есть шанс, что вы пропустите один). – MrFlick
@MrFlick - о, хорошая точка - не совсем вопрос. К сожалению нет времени прямо сейчас, чтобы поехать на него - с нетерпением ждем других ответов – jalapic
Спасибо за попытку! –