我希望以与输入向量相同的频率生成不同的可能排列。例如,我想使用下面示例中的向量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}的排列。预期的输出是:
# [,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)
答案 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"