R: 从向量生成所有唯一排列

4
我有一个向量,其中某些条目重复出现。我想从这个向量中获取每个可能的唯一排列。
在查找时,我发现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
2个回答

5

使用方法如下:

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"

2
您可以尝试使用 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"

谢谢你的回答。基本上它所做的与我尝试使用RcppAlgos相同,但我在一个更长的字符上尝试了一下,而且pracma似乎更慢。 - P. Denelle
非常感谢,我刚刚接受了@G.Grothendieck的答案。 - P. Denelle
@P.Denelle 不用担心 :) G.Grothendieck的回答更简明。 - ThomasIsCoding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接