选择一组标记来区分个体

Choose a set of markers to distinguish individuals

我有一些来自 8 个标记和 20 个个体的基因型数据。我想从8个标记中select 5个标记,可以为每个个体形成一个独特的基因型模式。目的是select尽可能少的标记来区分这20个人

我知道我需要 select 8 列中的 5 列,然后比较每一行。如果我们发现重复的行,那么我们需要重新select另外5列,直到我们发现没有重复的行。

但我不知道如何将其翻译成 R。有人可以帮忙吗?谢谢!

示例数据

Indiv   MN1 MN2 MN3 MN4 MN5 MN6 MN7 MN8
1   A   C   C   A   C   G   A   T
2   A   C   T   A   T   A   A   T
3   A   C   T   G   C   A   A   C
4   A   C   T   G   C   G   G   C
5   A   T   C   G   C   A   A   C
6   A   T   C   G   C   A   G   C
7   A   T   T   A   T   A   A   T
8   A   T   T   A   T   A   G   T
9   A   T   T   A   T   G   G   C
10  G   C   C   A   C   A   A   C
11  G   C   C   A   C   G   A   T
12  G   C   C   G   C   G   G   T
13  G   C   C   G   T   G   G   T
14  G   C   T   G   C   G   A   T
15  G   C   T   G   T   A   G   C
16  G   T   C   A   T   A   G   T
17  G   T   C   G   T   A   A   C
18  G   T   T   A   C   G   G   T
19  G   T   T   G   T   G   G   T

不可能。假设我们不能改变标记的顺序。您至少需要 6 个标记来区分个体。考虑这个功能(蛮力解决方案)。

distinct_combn <- function(df, m) {
  out <- combn(df, m, function(x) {
    if (nrow(unique(x)) == nrow(x)) names(x) else character(0L)
  }, simplify = FALSE)
  out[lengths(out) > 0L]
}

那么我们可以看到

> distinct_combn(df[, -1L], 5)
list()

> distinct_combn(df[, -1L], 6)
[[1]]
[1] "MN1" "MN2" "MN3" "MN5" "MN6" "MN7"

[[2]]
[1] "MN1" "MN2" "MN3" "MN5" "MN7" "MN8"

[[3]]
[1] "MN1" "MN2" "MN4" "MN5" "MN6" "MN7"

[[4]]
[1] "MN1" "MN2" "MN4" "MN5" "MN7" "MN8"

我使用的数据

> df
   Indiv MN1 MN2 MN3 MN4 MN5 MN6 MN7 MN8
1      1   A   C   C   A   C   G   A   T
2      2   A   C   T   A   T   A   A   T
3      3   A   C   T   G   C   A   A   C
4      4   A   C   T   G   C   G   G   C
5      5   A   T   C   G   C   A   A   C
6      6   A   T   C   G   C   A   G   C
7      7   A   T   T   A   T   A   A   T
8      8   A   T   T   A   T   A   G   T
9      9   A   T   T   A   T   G   G   C
10    10   G   C   C   A   C   A   A   C
11    11   G   C   C   A   C   G   A   T
12    12   G   C   C   G   C   G   G   T
13    13   G   C   C   G   T   G   G   T
14    14   G   C   T   G   C   G   A   T
15    15   G   C   T   G   T   A   G   C
16    16   G   T   C   A   T   A   G   T
17    17   G   T   C   G   T   A   A   C
18    18   G   T   T   A   C   G   G   T
19    19   G   T   T   G   T   G   G   T

> dput(df)
structure(list(Indiv = 1:19, MN1 = c("A", "A", "A", "A", "A", 
"A", "A", "A", "A", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G"), MN2 = c("C", "C", "C", "C", "T", "T", "T", "T", "T", "C", 
"C", "C", "C", "C", "C", "T", "T", "T", "T"), MN3 = c("C", "T", 
"T", "T", "C", "C", "T", "T", "T", "C", "C", "C", "C", "T", "T", 
"C", "C", "T", "T"), MN4 = c("A", "A", "G", "G", "G", "G", "A", 
"A", "A", "A", "A", "G", "G", "G", "G", "A", "G", "A", "G"), 
    MN5 = c("C", "T", "C", "C", "C", "C", "T", "T", "T", "C", 
    "C", "C", "T", "C", "T", "T", "T", "C", "T"), MN6 = c("G", 
    "A", "A", "G", "A", "A", "A", "A", "G", "A", "G", "G", "G", 
    "G", "A", "A", "A", "G", "G"), MN7 = c("A", "A", "A", "G", 
    "A", "G", "A", "G", "G", "A", "A", "G", "G", "A", "G", "G", 
    "A", "G", "G"), MN8 = c("T", "T", "C", "C", "C", "C", "T", 
    "T", "C", "C", "T", "T", "T", "T", "C", "T", "C", "T", "T"
    )), class = "data.frame", row.names = c(NA, -19L))