根据具有重复项的数据创建组,以便每个组都有一个表示一次的重复项

  • 本文关键字:表示 有一个 一次 数据 创建组 r
  • 更新时间 :
  • 英文 :


我对大约3000个样本进行了测序。最初对样本进行标记,并通过PCR进行扩增,一式两份。使用的标签范围从Tag1到Tag26。

Tag1-Tag13用于对1,Tag14-Tag26用于对2。标签被重新使用,以允许对样本进行合并。

合并过程将包括将带有标签1-26的样本混合到第一组,将1-26的下一个样本混合到第二组,依此类推。值得注意的是,有时会因为相应的样本未能扩增而丢失一些标签。

在去实验室之前,我需要先把这些小组写在纸上。

以下是分组前的样本快照。(注意,Tag01Tag05用于样本数据集中的TagATag06Tag10用于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希望对他的样本进行分组,这样

  1. 每组包含尽可能多的样本
  2. 每组仅包含CCD_ 7的一个不同元素和CCD_
  3. 样品尽可能保持原样

下面的方法通过将所有样本放在一组中,然后(从上到下)查找放在下一组中的任何重复样本来迭代工作。此操作将继续,直到找不到具有重复项的组为止。

这里使用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
D_10

注意

这可能不是最有效的方法和/或实施。然而,在开始考虑优化之前,我想手头上有一些能达到预期结果的东西。

相关内容

最新更新