选择一组标记来区分个体
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))
我有一些来自 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))