You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中高效逐单元格比对两个data.table并优化大表处理速度

高效合并两个data.table并标记基因型差异位点

问题说明

现有两个data.table对象dt1和dt2,结构如下:

  • 前两列:Chromosome(染色体)、Position(位置)
  • 剩余列:不同样本的基因型值(仅为0、1、2)
    两个表格的样本列完全一致,但位点(Chromosome+Position组合)可能不完全重合。

需要生成第三个表格dt3:

  • 前两列保留Chromosome和Position,包含dt1或dt2中的所有位点
  • 样本列规则:
    • 标记为1:该位点仅在其中一个表格存在,或两个表格中该样本的基因型不同
    • 标记为0:两个表格中该位点的该样本基因型完全一致
      要求基于data.table或R的特性实现高效处理,适配大数据量场景。

示例数据

dt1 <- data.table(Chromosome = c("chr1", "chr1", "chr2"),
                  Position = c(100, 200, 300),
                  Sample1 = c(0, 0, 1),
                  Sample2 = c(1, 1, 2))

dt2 <- data.table(Chromosome = c("chr1", "chr2", "chr2"),
                  Position = c(200, 300, 400),
                  Sample1 = c(0, 1, 2),
                  Sample2 = c(0, 1, 0))

预期输出

dt3
   Chromosome Position Sample1 Sample2
1:       chr1      100       1       1 # chr1:100仅存在于dt1
2:       chr1      200       0       1 # chr1:200在Sample2中存在差异
3:       chr2      300       0       1 # chr2:300在Sample2中存在差异
4:       chr2      400       1       1 # chr2:400仅存在于dt2

当前代码及优化需求

已参考他人思路实现了一段可运行的代码(支持任意样本列名),但在大数据量场景下运行速度不足,希望进一步优化:

# 合并两个表格,保留所有位点
dt3 <- merge(
  dt1,
  dt2,
  all = TRUE,
  by = c("Chromosome", "Position")
)

# target_sample为提取出的样本列名列表
for(sample_name in target_sample){
    dt3[, (sample_name) := as.integer(!mapply(identical, get(paste0(sample_name, '.x')), get(paste0(sample_name, '.y'))))][
        , c(paste0(sample_name, '.x'), paste0(sample_name, '.y')) := NULL ]
}

内容的提问来源于stack exchange,提问作者zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 23:47:13