То, что вы просите, эквивалентно нахождению всех перестановок length = n
, где n = nrow(c1)
(или c2
выше).Используя FUN
аргумент permuteGeneral
из RcppAlgos
(я автор), мы можем легко сгенерировать желаемый результат:
n <- 3L
myIdentity <- diag(nrow = n)
library(RcppAlgos)
permuteGeneral(n, n, FUN = function(x) myIdentity[x, ])
[[1]]
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
[[2]]
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 0 1
[3,] 0 1 0
[[3]]
[,1] [,2] [,3]
[1,] 0 1 0
[2,] 1 0 0
[3,] 0 0 1
[[4]]
[,1] [,2] [,3]
[1,] 0 1 0
[2,] 0 0 1
[3,] 1 0 0
[[5]]
[,1] [,2] [,3]
[1,] 0 0 1
[2,] 1 0 0
[3,] 0 1 0
[[6]]
[,1] [,2] [,3]
[1,] 0 0 1
[2,] 0 1 0
[3,] 1 0 0
Существует много других способов генерации запрошенного вывода.В частности, используя проверенный и действительный пакет combinat
, мы можем получить аналогичный результат (выходные данные будут в другом порядке):
combinat::permn(3, fun = function(x) myIdentity[x, ])
Теперь, когда мы уменьшили проблему до простой генерации перестановокмы можем использовать любой из лучших пакетов (arrangements
, gtools
, multicool
, partitions
и т. д.) для генерации перестановок, чтобы получить желаемый результат с помощью lapply
:
library(arrangements)
myPerms <- permutations(n)
lapply(1:nrow(myPerms), function(x) myIdentity[myPerms[x,], ])