基于公共行合并两个海量表[重复]

Posted

技术标签:

【中文标题】基于公共行合并两个海量表[重复]【英文标题】:Merging two massive tables based on common rows [duplicate] 【发布时间】:2015-08-27 20:32:35 【问题描述】:

我有两个包含遗传 SNP 数据的大型数据表(或将拥有它们,我仍然需要将它们转换为相同的格式)。

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

两个表都有 >100,000 行,其中包含不同但重叠的 SNP 的数据。每列都是一个人(一个表有超过 900 个样本,一个有 >80 个)。一旦另一个表格的格式正确,两个表格都将如下所示

dbSNP_RSID  Sample1 Sample2 Sample3 Sample4 Sample5
rs1000001   CC  CC  CC  CC  TC
rs1000002   TC  TT  CC  TT  TT
rs1000003   TG  TG  TT  TG  TG

我想制作一个包含 >1000 列的大表,并且两个表中都表示 >100,000 行的交集。 R 似乎是一种很好的语言。有人对如何做到这一点有任何建议吗?谢谢!

【问题讨论】:

我的意思是“交叉点”。如果您想将两张表并排放在一张更大的表中,请使用cbind(table1, table2)。行数必须完全相同。它看起来像一个数据框,但在 R 语言中它将被视为matrix。取决于你接下来要做什么,这可能就是你所需要的。 行的顺序是否相同,还是必须匹配? 这两个答案都可以解决。 merge(table1, table2, by='dbSNP_RSID') 确保将 by 参数放在引号中,我总是忘记这一点。 【参考方案1】:

您可以只使用merge,例如:

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

如果您的示例具有重叠的列名,那么您会发现 mergeTable 具有(例如)名为 Sample1.x 和 Sample1.y 的列。这可以通过在合并之前或之后重命名列来解决。

可重现的例子:

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")

【讨论】:

您已读取没有标题的数据。每列将被命名为 V1、V2 等。然后您尝试使用不存在的名为“dbSNP_RSID”的列进行合并。您需要适当地命名列。【参考方案2】:

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

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

【讨论】:

以上是关于基于公共行合并两个海量表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

基于公共列合并多个数据框[重复]

整行不匹配时的oracle合并语句[重复]

JZ3.从尾到头打印链表;JZ14.链表中倒数第K个节点;JZ15.反转链表;JZ16.合并两个有序链表;JZ36.两个链表的第一个公共节点;JZ55.链表中环的入口节点;JZ56.删除链表中重复节点

JZ3.从尾到头打印链表;JZ14.链表中倒数第K个节点;JZ15.反转链表;JZ16.合并两个有序链表;JZ36.两个链表的第一个公共节点;JZ55.链表中环的入口节点;JZ56.删除链表中重复节点

MYSQL:合并重复行

两个表中具有多个公共属性的自然连接[重复]