【问题标题】:how to do the systematic permutation in R?如何在R中进行系统排列?
【发布时间】:2020-03-17 04:14:43
【问题描述】:

我有一个包含 9 个观察值并设置为 3 个处理的向量。我需要做系统排列,而不是9!。它是 9!/(2!3!4!)=1260。前9选2,后7选3,其余obs会治疗3。 我已经编写了两部分的代码,但我不知道如何列出所有可能的结果。由于有一些观察结果是重复的。排列不太对。我需要首先为每个观察分配 ID。我有一些关于如何首先分配 id 和 permute id 的问题,然后返回真实的观察结果。 清单是我的 R 代码。有一些错误。我需要帮助来完成这个程序。谢谢!

for (k in 1260) {
  allperm<-c(A,B,C)
  A <- combn(complete, 2)
  for (i in 1:36){
    complete_B <- complete[!(complete %in% A[,i])]
    B <- combn(complete_B, 3)
    for (j in 1:35){
      C <- complete_B[!(complete_B %in% c(B[,j], A[,i]))]     
    }
  }
}

【问题讨论】:

    标签: r permutation


    【解决方案1】:

    这是一个基本的 R 解决方案,用于获取所有排列 allPerms 以及分区 ABC

    v <- 1:9
    allPerms <- lapply(sapply(combn(v,2,simplify = FALSE), 
                              function(p) combn(v[-p],3,FUN = function(k) c(p,k),simplify = FALSE)),
                       function(k) c(k,v[-k]))
    
    A <- lapply(allPerms, `[`,1:2)
    B <- lapply(allPerms, `[`,3:5)
    C <- lapply(allPerms, `[`,6:9)
    

    这样

    > head(allPerms)
    [[1]]
    [1] 1 2 3 4 5 6 7 8 9
    
    [[2]]
    [1] 1 2 3 4 6 5 7 8 9
    
    [[3]]
    [1] 1 2 3 4 7 5 6 8 9
    
    [[4]]
    [1] 1 2 3 4 8 5 6 7 9
    
    [[5]]
    [1] 1 2 3 4 9 5 6 7 8
    
    [[6]]
    [1] 1 2 3 5 6 4 7 8 9
    
    > head(A)
    [[1]]
    [1] 1 2
    
    [[2]]
    [1] 1 2
    
    [[3]]
    [1] 1 2
    
    [[4]]
    [1] 1 2
    
    [[5]]
    [1] 1 2
    
    [[6]]
    [1] 1 2
    
    > head(B)
    [[1]]
    [1] 3 4 5
    
    [[2]]
    [1] 3 4 6
    
    [[3]]
    [1] 3 4 7
    
    [[4]]
    [1] 3 4 8
    
    [[5]]
    [1] 3 4 9
    
    [[6]]
    [1] 3 5 6
    
    > head(C)
    [[1]]
    [1] 6 7 8 9
    
    [[2]]
    [1] 5 7 8 9
    
    [[3]]
    [1] 5 6 8 9
    
    [[4]]
    [1] 5 6 7 9
    
    [[5]]
    [1] 5 6 7 8
    
    [[6]]
    [1] 4 7 8 9
    

    如果你想要矩阵格式的输出,你可以试试下面的代码

    v <- 1:9
    allPerms <- sapply(sapply(combn(v,2,simplify = FALSE), 
                              function(p) combn(v[-p],3,FUN = function(k) c(p,k),simplify = FALSE)),
                       function(k) c(k,v[-k]))
    
    A <- allPerms[1:2,]
    B <- allPerms[3:5,]
    C <- allPerms[6:9,]
    

    【讨论】:

    • @wand2020 这是想要的答案吗?
    • 非常感谢!我知道如何列出排列的所有结果,因为它只显示排列的数量。 head(allPerms) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [, 12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [, 37] [,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] ....
    • @wand2020 矩阵是一个 9×1260 矩阵,每个模式按列读取
    • @wand2020 你可以使用View(allPerms)查看结果
    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2015-03-21
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多