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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:30:02