我对大约3000个样本进行了测序。最初对样本进行标记,并通过PCR进行扩增,一式两份。使用的标签范围从Tag1到Tag26。
Tag1-Tag13用于对1,Tag14-Tag26用于对2。标签被重新使用,以允许对样本进行合并。
合并过程将包括将带有标签1-26的样本混合到第一组,将1-26的下一个样本混合到第二组,依此类推。值得注意的是,有时会因为相应的样本未能扩增而丢失一些标签。
在去实验室之前,我需要先把这些小组写在纸上。
以下是分组前的样本快照。(注意,Tag01
至Tag05
用于样本数据集中的TagA
,Tag06
至Tag10
用于TagB
。)
preGroup <- structure(list(SampleID = 1:19, TagA = structure(c(3L, 4L, 5L,
3L, 4L, 5L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 3L, 4L, 1L, 2L, 3L, 4L
), .Label = c("Tag01", "Tag02", "Tag03", "Tag04", "Tag05"), class = "factor"),
TagB = structure(c(5L, 1L, 2L, 4L, 5L, 1L, 1L, 2L, 3L, 5L,
1L, 2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L), .Label = c("Tag06",
"Tag07", "Tag08", "Tag09", "Tag10"), class = "factor")), class = "data.frame", row.names = c(NA,
-19L))
SampleID TagA TagB
1 1 Tag03 Tag10
2 2 Tag04 Tag06
3 3 Tag05 Tag07
4 4 Tag03 Tag09
5 5 Tag04 Tag10
6 6 Tag05 Tag06
7 7 Tag01 Tag06
8 8 Tag02 Tag07
9 9 Tag03 Tag08
10 10 Tag01 Tag10
11 11 Tag02 Tag06
12 12 Tag03 Tag07
13 13 Tag01 Tag08
14 14 Tag03 Tag09
15 15 Tag04 Tag10
16 16 Tag01 Tag07
17 17 Tag02 Tag08
18 18 Tag03 Tag09
19 19 Tag04 Tag10
这是分组后的相同数据。。。
postGroup <- structure(list(SampleID = c(1L, 2L, 3L, 4L, 5L, 6L, 8L, 9L, 10L,
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 7L), TagA = structure(c(3L,
4L, 5L, 3L, 4L, 5L, 2L, 3L, 1L, 2L, 3L, 1L, 3L, 4L, 1L, 2L, 3L,
4L, 1L), .Label = c("Tag01", "Tag02", "Tag03", "Tag04", "Tag05"
), class = "factor"), TagB = structure(c(5L, 1L, 2L, 4L, 5L,
1L, 2L, 3L, 5L, 1L, 2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 1L), .Label = c("Tag06",
"Tag07", "Tag08", "Tag09", "Tag10"), class = "factor"), group = structure(c(1L,
1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 5L, 5L, 5L, 5L, 6L,
6L, 7L), .Label = c("group1", "group2", "group3", "group4", "group5",
"group6", "group7"), class = "factor")), class = "data.frame", row.names = c(NA,
-19L))
SampleID TagA TagB group
1 1 Tag03 Tag10 group1
2 2 Tag04 Tag06 group1
3 3 Tag05 Tag07 group1
4 4 Tag03 Tag09 group2
5 5 Tag04 Tag10 group2
6 6 Tag05 Tag06 group2
7 8 Tag02 Tag07 group2
8 9 Tag03 Tag08 group3
9 10 Tag01 Tag10 group3
10 11 Tag02 Tag06 group3
11 12 Tag03 Tag07 group4
12 13 Tag01 Tag08 group4
13 14 Tag03 Tag09 group5
14 15 Tag04 Tag10 group5
15 16 Tag01 Tag07 group5
16 17 Tag02 Tag08 group5
17 18 Tag03 Tag09 group6
18 19 Tag04 Tag10 group6
19 7 Tag01 Tag06 group7
我正在寻找一个可以创建这些组的R脚本,因为我们习惯于使用少于50个样本,我们会手动创建组,然而,这项任务的规模太大了。。。
最后,因为样本在1000年代,如果代码能够尽可能多地保持样本的原始顺序,那就更好了,因为样本1更接近样本50,而不是样本500,以实现实验室中简单的顺序检索过程(我希望这是有意义的…)
如果我理解正确,OP希望对他的样本进行分组,这样
- 每组包含尽可能多的样本
- 每组仅包含CCD_ 7的一个不同元素和CCD_
- 样品尽可能保持原样
下面的方法通过将所有样本放在一组中,然后(从上到下)查找放在下一组中的任何重复样本来迭代工作。此操作将继续,直到找不到具有重复项的组为止。
这里使用data.table是因为它能够通过引用来更新,即无需复制整个对象。
library(data.table)
grouped <- as.data.table(preGroup)[order(SampleID)][, group := 1L][]
max_grp <- 1L
while (any(grouped[, anyDuplicated(TagA) | anyDuplicated(TagB), by = group]$V1)) {
max_grp <- max_grp + 1L
dups <- duplicated(grouped, by = c("group", "TagA")) |
duplicated(grouped, by = c("group", "TagB"))
grouped[dups, group := max_grp][]
stopifnot(max_grp <= nrow(grouped)) # just to prevent infinite looping
}
grouped
SampleID TagA TagB group 1: 1 Tag03 Tag10 1 2: 2 Tag04 Tag06 1 3: 3 Tag05 Tag07 1 4: 4 Tag03 Tag09 2 5: 5 Tag04 Tag10 2 6: 6 Tag05 Tag06 2 7: 7 Tag01 Tag06 3 8: 8 Tag02 Tag07 2 9: 9 Tag03 Tag08 3 10: 10 Tag01 Tag10 4 11: 11 Tag02 Tag06 4 12: 12 Tag03 Tag07 4 13: 13 Tag01 Tag08 5 14: 14 Tag03 Tag09 5 15: 15 Tag04 Tag10 5 16: 16 Tag01 Tag07 6 17: 17 Tag02 Tag08 6 18: 18 Tag03 Tag09 6 19: 19 Tag04 Tag10 6
请注意,此结果比OP手工挑选的postGroup
少一组,后者包含仅具有一个样本的第七组。
我们可以执行一些检查来验证条件2。已完成:
grouped[, anyDuplicated(TagA), by = group]
D_10group V1 1: 1 0 2: 2 0 3: 3 0 4: 4 0 5: 5 0 6: 6 0
注意
这可能不是最有效的方法和/或实施。然而,在开始考虑优化之前,我想手头上有一些能达到预期结果的东西。