r - 如何在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]))]
}
}
}
解决方案
这是获得所有排列allPerms
以及分区的基本 R 解决方案A
,B
并且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,]
推荐阅读
- javascript - 带有电子邮件和密码的firebase身份验证不起作用
- angular - Karma 没有运行任何服务测试,只有组件
- java - 当 previous.equals(" ") 时停止列表迭代器打印上一个
- ios - Swift 中的顶栏
- php - 如何在 axios react js 中设置 url?
- python - 使用 python paramiko 包获取路由器日志
- python - 如何将我的 python 应用程序制作/转换为 Rshiny 应用程序?它是一个脑筋急转弯!无法在 R 中找到 UI 需要的更改
- node.js - Android 应用程序不通过 socket.io 连接
- python - 无法使用 Selenium 定位元素
- java - 我如何获得这些标记值?