如何基于ID匹配用DT1的exit1覆盖不同长度表DT2的exit2列值
问题描述
现有两个存储同一人群不同信息、长度不同的data.table表,结构如下:
DT1 <- data.table(ID = c(1,2,3,5), exit1 = c(NA, "01/02/2016", "01/10/2010", "01/01/2016"), value = c(2,4,5,4)) DT1 # ID exit1 value # 1: 1 <NA> 2 # 2: 2 01/02/2016 4 # 3: 3 01/10/2010 5 # 4: 5 01/01/2016 4
第二个表结构:
DT2 <- data.table(ID = 1:5, exit2 = c("31/01/2016", "01/01/2021", "30/09/2019", "31/12/2015", "30/09/2020"), text = c("a","b","c","a","e")) DT2 # ID exit2 text # 1: 1 31/01/2016 a # 2: 2 01/01/2021 b # 3: 3 30/09/2019 c # 4: 4 31/12/2015 a # 5: 5 30/09/2020 e
需求:基于ID进行匹配,用DT1的exit1列值覆盖DT2的exit2列:若exit1存在非空值则替换exit2对应值,否则保留exit2原有值。预期输出如下:
ID exit2 text 1: 1 31/01/2016 a 2: 2 01/02/2016 b 3: 3 01/10/2010 c 4: 4 31/12/2015 a 5: 5 01/01/2016 e
实现方法
使用data.table原生的更新连接即可高效实现需求,核心逻辑是先过滤DT1中exit1非空的行,再按ID匹配到DT2后直接更新exit2的值,未匹配到的行自动保留原有值,不需要额外复制整张表。
完整代码如下:
library(data.table) # 核心更新语句 DT2[DT1[!is.na(exit1)], on = .(ID), exit2 := i.exit1] # 输出验证结果 print(DT2)
代码说明:语法中i.exit1代表取连接右表(即DT1过滤后的子集)的exit1列,避免列名冲突。如果需要保留原始DT2不被修改,可以先复制DT2再执行更新操作:DT2_new <- copy(DT2); DT2_new[DT1[!is.na(exit1)], on = .(ID), exit2 := i.exit1]。
内容的提问来源于stack exchange,提问作者Besz15
相关产品推荐
相关产品推荐

