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似乎是一种很好的语言。有人对怎么做有什么建议吗?谢谢!
您可以只使用
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,其中
1 2 3 4 | library(data.table) setkey(DT1,"id") setkey(DT2,"id") DT <- merge(DT1,DT2,by ="id") |