我希望以与输入向量中相同的频率生成不同的可能排列 . 例如,我想使用下面示例中的向量 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"
但是,我只希望分别具有频率为2,1的 A
, B
的排列 . 预期的产出是:
# [,1] [,2] [,3]
# [1,] "A" "A" "B"
# [2,] "A" "B" "A"
# [3,] "B" "A" "A"
R中是否有任何功能?
注意:我不想对输出进行后处理以获得预期的输出,因为我的原始输入包含300个元素 . 建议不要生成 factorial(300)
个排列 .
Update: 建议的link提供了一个很好的faster solution但在输入向量加倍时失败(例如: length=20
),并显示错误消息:
矩阵中的错误(NA,nrow = N,ncol = prod(sapply(foo,ncol))):无效的'ncol'值(太大或NA)
1 回答
您的问题可以重新表述为找到频率向量的所有可能的排列 . 看看
combinat::permn
:删除重复条目需要
unique
,这是由您一直使用的gtools::permutations
自动完成的(通过默认的set=TRUE
参数) .如果您需要矩阵格式的结果(如原始问题中所示),请使用
do.call
将输出作为参数传递给rbind
: