关于r:基于公共行合并两个大型表


Merging two massive tables based on common rows

本问题已经有最佳答案,请猛点这里访问。

我有两个包含遗传单核苷酸多态性数据的大数据表(或者将要有它们,我仍然需要把它们转换成相同的格式)。

这些是非常大的表,所以我对它们做的任何事情都必须在集群中进行。

两个表都有大于600000行,其中包含不同但重叠的SNP的数据。每列都是一个人(一张表有942个样本,一个有92个)。一旦另一个表的格式正确,两个表都将如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dbSNP_RSID  Sample1 Sample2 Sample3 Sample4 Sample5
rs10000011  CC  CC  CC  CC  TC
rs1000002   TC  TT  CC  TT  TT
rs10000023  TG  TG  TT  TG  TG
rs1000003   AA  AG  AG  AA  AA
rs10000041  TT  TG  TT  TT  TG
rs10000046  GG  GG  AG  GG  GG
rs10000057  AA  AG  GG  AA  AA
rs10000073  TC  TT  TT  TT  TT
rs10000092  TC  TC  CC  TC  TT
rs1000014   GG  GG  GG  GG  GG
rs10000154  GG  AG  AG  AA  AG
rs10000159  GG  AG  GG  GG  AG
rs1000016   AA  AG  AA  AG  GG
rs10000182  AA  AA  AG  AA  AA
rs1000020   TC  TC  TT  TT  TC

我想制作一个列数大于1000的大表,它有两个表中表示的约600000行的交集。R似乎是一种很好的语言。有人对怎么做有什么建议吗?谢谢!


您可以只使用merge,例如:

1
mergedTable <- merge(table1, table2, by ="dbSNP_RSID")

如果示例的列名重叠,则会发现合并表中有(例如)名为sample1.x和sample1.y的列。可以通过在合并之前或之后重命名列来解决此问题。

再现性示例:

1
2
3
4
5
6
7
8
9
x <- data.frame(dbSNP_RSID = paste0("rs", sample(1e6, 1e5)),
  matrix(paste0(sample(c("A","C","T","G"), 1e7, replace = TRUE),
    sample(c("A","C","T","G"), 1e7, replace = TRUE)), ncol = 100))
y <- data.frame(dbSNP_RSID = paste0("rs", sample(1e6, 1e5)),
  matrix(paste0(sample(c("A","C","T","G"), 1e7, replace = TRUE),
    sample(c("A","C","T","G"), 1e7, replace = TRUE)), ncol = 100))
colnames(x)[2:101] <- paste0("Sample", 1:100)
colnames(y)[2:101] <- paste0("Sample", 101:200)
mergedDf <- merge(x, y, by ="dbSNP_RSID")


使用data.table,其中DT1是第一个表,DT2是第二个:

1
2
3
4
library(data.table)
setkey(DT1,"id")
setkey(DT2,"id")
DT <- merge(DT1,DT2,by ="id")