Я думаю, это то, что вы ищете.@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)