首页 文章

如何在R中生成分层排列

提问于
浏览
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"

但是,我只希望分别具有频率为2,1的 AB 的排列 . 预期的产出是:

#     [,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 回答

  • 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 参数) .

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

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

相关问题