2

我想以与输入向量相同的频率生成不同的可能排列。例如,我想使用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" 

A但是,我只想要B频率分别为 2 和 1 的排列。预期的输出是:

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

R中有任何可用的功能吗?

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

更新:建议的链接提供了一个更快的解决方案,但是当输入向量加倍时失败(例如:)length=20并显示错误消息:

矩阵中的错误(NA,nrow = N,ncol = prod(sapply(foo,ncol))):
无效的“ncol”值(太大或 NA)

4

1 回答 1

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参数)自动完成的。

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

do.call( rbind, unique(combinat::permn( x )) )
#      [,1] [,2] [,3]
# [1,] "A"  "A"  "B" 
# [2,] "A"  "B"  "A" 
# [3,] "B"  "A"  "A" 
于 2017-10-27T19:39:14.107 回答