我正在寻求有关 R 组合的一些帮助。
简而言之,我有一个由三个人 (I) 和一些我有兴趣研究的标记 (M) 组成的小组。对于每个标记,每个人要么是阳性的,要么是阴性的。一些标记在该组中的两个人中是阳性的,而一些标记在该组中的三个人中是阳性的。
我有兴趣找到组中每个成员之间存在的所有标记组合,使得每个标记在任何特定分组中只研究一次。
# three possible individuals in the group
I <- c("I1","I2","I3")
# 8 possible markers in the group
M <- paste0("M", seq(1,8))
# each marker can be either present (TRUE) or absent (FALSE)
# in general, more markers are present than absent
# this is random data for the purpose of example
P <- sample(c(rep(TRUE, 16),rep(FALSE, 8)))
# the input data looks like this
d <- data.frame(I=rep(I, each=8), M=rep(M, 3), P=P)
I M P
1 I1 M1 TRUE
2 I1 M2 FALSE
3 I1 M3 TRUE
4 I1 M4 FALSE
5 I1 M5 FALSE
6 I1 M6 TRUE
我的首选输出是一个长数据框,例如:
Option I M
1 1 1
1 1 2
1 2 3
2 1 2
2 2 1
2 2 3
每个选项都是该组三个成员中每个成员之间阳性标记的独特分布。这相当于一个宽数据框,例如:
Option I1 I2 I3
1 M1, M2 M3
2 M2 M1, M3
3
主要挑战是(i)所有标记必须在每个选项中表示,并且(ii)每个标记在每个选项中仅应研究一次(在该组中的一个人中)。不必在每个选项中都代表所有个人。
我怀疑解决方案将包括以下关键步骤:
- 生成分配给三个组成员中每个成员的所有可能的标记组合,而不会在个体之间重复标记。
- 删除正在测试的标记在分配给它的特定个人中不存在 (TRUE) 的组合。
- 如果在第一步中尚未成功实现,则删除组合中存在重复标记的组合。
我真的为此苦苦挣扎,并花了一整天时间使用 grid.expand 和 combn 编写了一个非常复杂的基于循环的方法,但没有成功。它过于复杂和混乱,无法包括在这里。任何帮助表示赞赏。