我有一个向量,其中某些条目是重复的。从这个向量中,我想得到每一个可能的、唯一的排列。
环顾四周,我发现gtools::permutations()
被推荐了几次,但它不能解决我的问题。
我找到了RcppAlgos::permuteGeneral()
的方法,但问题是它将每个条目都视为唯一值,然后我必须在第二步中删除重复项。这可能会导致内存问题。
有没有一种简单快速的方法可以从向量中获得所有独特的排列?
这里有一个可重复的例子:
library(RcppAlgos)
ex <- c("sp1", "sp2", "sp2") # sp2 is repeated twice
perm <- permuteGeneral(v = ex, m = length(ex), repetition = FALSE, freqs = NULL)
perm <- as.data.frame(perm)
perm # some rows are identical (rows 1&2; 3&5, 4&6)
V1 V2 V3
1 sp1 sp2 sp2
2 sp1 sp2 sp2
3 sp2 sp1 sp2
4 sp2 sp2 sp1
5 sp2 sp1 sp2
6 sp2 sp2 sp1
perm[!duplicated(perm), ] # this is what I want
V1 V2 V3
1 sp1 sp2 sp2
3 sp2 sp1 sp2
4 sp2 sp2 sp1
这样使用它:
library(RcppAlgos)
tab <- table(ex)
permuteGeneral(v = names(tab), freq = tab)
## [,1] [,2] [,3]
## [1,] "sp1" "sp2" "sp2"
## [2,] "sp2" "sp1" "sp2"
## [3,] "sp2" "sp2" "sp1"
您可以尝试unique
+perms
> unique(pracma::perms(ex))
[,1] [,2] [,3]
[1,] "sp2" "sp2" "sp1"
[2,] "sp2" "sp1" "sp2"
[3,] "sp1" "sp2" "sp2"
或者我们可以这样做
permuteGeneral(
v = unique(ex),
m = length(ex),
freqs = table(ex)
)
它给出
[,1] [,2] [,3]
[1,] "sp1" "sp2" "sp2"
[2,] "sp2" "sp1" "sp2"
[3,] "sp2" "sp2" "sp1"