【问题标题】: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 参数放在引号中,我总是忘记这一点。

标签: r


【解决方案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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多