如何在R

时间:2017-10-27 19:26:19

标签: r permutation permute

我希望以与输入向量相同的频率生成不同的可能排列。例如,我想使用下面示例中的向量x生成排列。

library(gtools)
x <- c('A','A','B')
permutations(2, 3, x, repeats.allowed = T)

它给出了以下输出。

#     [,1] [,2] [,3]
# [1,] "A"  "A"  "A" 
# [2,] "A"  "A"  "B" 
# [3,] "A"  "B"  "A" 
# [4,] "A"  "B"  "B" 
# [5,] "B"  "A"  "A" 
# [6,] "B"  "A"  "B" 
# [7,] "B"  "B"  "A" 
# [8,] "B"  "B"  "B" 

但是,我只想要AB的频率分别为2,1 {1}的排列。预期的输出是:

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

R中是否有可用的功能?

注意:我不想对输出进行后处理以获得预期的输出,因为我的原始输入包含300个元素。建议不要生成factorial(300)个排列。

更新:建议的link提供了一个不错的faster solution,但在输入向量加倍时失败(例如:length=20)并显示错误消息:< / p>

  

矩阵错误(NA,nrow = N,ncol = prod(sapply(foo,ncol))):
  无效&#39; ncol&#39;值(太大或NA)

1 个答案:

答案 0 :(得分:2)

您的问题可以重新表述为找到频率向量的所有可能的排列。看看combinat::permn

x <- c( 'A', 'A', 'B' )
unique(combinat::permn( x ))

# [[1]]
# [1] "A" "A" "B"

# [[2]]
# [1] "A" "B" "A"

# [[3]]
# [1] "B" "A" "A"
删除重复条目需要

unique,这是由您一直使用的gtools::permutations自动完成的(通过默认的set=TRUE参数)。

如果您需要矩阵格式的结果(如原始问题中所示),请使用rbind将输出作为参数传递给do.call

do.call( rbind, unique(combinat::permn( x )) )
#      [,1] [,2] [,3]
# [1,] "A"  "A"  "B" 
# [2,] "A"  "B"  "A" 
# [3,] "B"  "A"  "A"