我进行了约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 s之内,所以代码可以尝试尽可能多地将样本保持其原始顺序会更好,因为样本1比样本50更接近样本50对500个样本进行采样,以使实验室中的检索过程变得容易(我希望在这里有道理...)
答案 0 :(得分:1)
如果我理解正确,则OP希望对他的样本进行分组,以便
TagA
的一个不同元素和TagB
的一个不同元素,以下方法通过将所有样本放在一组中,然后查找放在下一组中的所有重复项(从上到下)来迭代地工作。这将继续直到找到没有重复的组。
在这里使用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]
group V1 1: 1 0 2: 2 0 3: 3 0 4: 4 0 5: 5 0 6: 6 0
grouped[, anyDuplicated(TagB), by = group]
group V1 1: 1 0 2: 2 0 3: 3 0 4: 4 0 5: 5 0 6: 6 0
这可能不是最有效的方法和/或实现。但是,在开始考虑优化之前,我希望手头能提供预期的结果。