R Вопрос Количество уникальных комбинаций A, A, A, A, B, B, B, B, B - PullRequest
5 голосов
/ 29 мая 2011

Я пытаюсь найти способ получить список в R всех возможных уникальных перестановок A, A, A, A, B, B, B, B, B.

Комбинации - это то, что изначально считалось методом получения решения, поэтому комбинации отвечают.

Ответы [ 2 ]

3 голосов
/ 29 мая 2011

Я думаю, это то, что вы ищете.@bill был на высоте с рекомендацией объединить unique и combn.Мы также будем использовать семейство apply для генерации ВСЕХ комбинаций.Так как unique удаляет дублирующиеся строки, нам нужно транспонировать результаты из combn до unique их.Затем мы транспонируем их обратно, прежде чем вернуться на экран, чтобы каждый столбец представлял уникальный ответ.

#Daters
x <- c(rep("A", 4), rep("B",5))
#Generates a list with ALL of the combinations
zz <- sapply(seq_along(x), function(y) combn(x,y))
#Filter out all the duplicates
sapply(zz, function(z) t(unique(t(z))))

, который возвращает:

[[1]]
     [,1] [,2]
[1,] "A"  "B" 

[[2]]
     [,1] [,2] [,3]
[1,] "A"  "A"  "B" 
[2,] "A"  "B"  "B" 

[[3]]
     [,1] [,2] [,3] [,4]
[1,] "A"  "A"  "A"  "B" 
[2,] "A"  "A"  "B"  "B" 
[3,] "A"  "B"  "B"  "B" 

...

РЕДАКТИРОВАТЬ Поскольку вопросо перестановках, а не комбинациях, ответ выше не так полезен. Этот пост описывает функцию для генерации уникальных перестановок, заданных набором параметров.Я понятия не имею, можно ли это улучшить, но вот один из подходов, использующих эту функцию:

fn_perm_list <-
 function (n, r, v = 1:n)
 {
    if (r == 1)
       matrix(v, n, 1)
    else if (n == 1)
       matrix(v, 1, r)
    else {
       X <- NULL
       for (i in 1:n) X <- rbind(X, cbind(v[i], fn_perm_list(n -
            1, r - 1, v[-i])))
        X
    }
 } 

zz <- fn_perm_list(9, 9)

#Turn into character matrix. This currently does not generalize well, but gets the job done
zz <- ifelse(zz <= 4, "A", "B")

#Returns 126 rows as indicated in comments
unique(zz)
2 голосов
/ 29 мая 2011

Нет необходимости генерировать перестановки, а затем выбирать уникальные. Вот гораздо более простой способ (и намного, намного быстрее): чтобы сгенерировать все перестановки 4 A и 5 B, нам просто нужно перечислить все возможные способы размещения 4 A среди 9 возможных мест. Это просто проблема комбинаций. Вот как мы можем это сделать:

x <- rep('B',9) # vector of 9 B's

a_pos <- combn(9,4) # all possible ways to place 4 A's among 9 positions

perms <- apply(a_pos, 2, function(p) replace(x,p,'A')) # all desired permutations

Каждый столбец матрицы 9x126 perms представляет собой уникальную перестановку 4 A и 5 B:

> dim(perms)
[1]   9 126
> perms[,1:4] ## look at first few columns
      [,1] [,2] [,3] [,4]
 [1,] "A"  "A"  "A"  "A" 
 [2,] "A"  "A"  "A"  "A" 
 [3,] "A"  "A"  "A"  "A" 
 [4,] "A"  "B"  "B"  "B" 
 [5,] "B"  "A"  "B"  "B" 
 [6,] "B"  "B"  "A"  "B" 
 [7,] "B"  "B"  "B"  "A" 
 [8,] "B"  "B"  "B"  "B" 
 [9,] "B"  "B"  "B"  "B" 
...