在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
相关产品推荐
相关产品推荐

