首页 > 解决方案 > 如何在R中进行系统排列?

问题描述

我有一个包含 9 个观察值并设置为 3 个处理的向量。我需要做系统排列,而不是9!。它是 9!/(2!3!4!)=1260。前 9 选择 2,然后 7 选择 3,其余 obs 将在治疗 3。我已经编写了 2 部分的代码,但我不知道如何列出所有可能的结果。由于有一些观察结果是重复的。排列不太对。我需要首先为每个观察分配 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]))]     
    }
  }
}

标签: rpermutation

解决方案


这是获得所有排列allPerms以及分区的基本 R 解决方案AB并且C

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,]

推荐阅读