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

R语言data.table如何通过表连接用另一表值替换对应列值

data.table匹配id替换列值实现方案

需求说明

现有名为big的data.table对象,需要使用另一个名为new_big的data.table中的对应值,替换big中匹配id的col列取值。

测试数据构造代码

library(data.table)
big <- structure(list(id = c("B", "C", "D", "E", "F", "G", "H", "I", 
"J", "K"), col = c(103L, 103L, 102L, 105L, 104L, 103L, 104L, 104L, 
104L, 103L)), row.names = c(NA, -10L), class = c("data.table", 
"data.frame"))
new_big <- structure(list(id = c("B", "E", "G"), col = c(1, 11, 111)), row.names = c(NA, 
-3L), class = c("data.table", "data.frame"))

测试数据内容

big表内容:

> big
    id col
 1:  B 103
 2:  C 103
 3:  D 102
 4:  E 105
 5:  F 104
 6:  G 103
 7:  H 104
 8:  I 104
 9:  J 104
10:  K 103

new_big表内容:

> new_big
   id col
1:  B   1
2:  E  11
3:  G 111

期望输出

id  col
 1:  B 1
 2:  C 103
 3:  D 102
 4:  E 11
 5:  F 104
 6:  G 111
 7:  H 104
 8:  I 104
 9:  J 104
10:  K 103

错误写法问题说明

尝试使用以下语句未得到预期结果:

big[new_big, on = .(id)]

该写法返回结果仅包含id匹配的行,同时存在col和i.col两列:

id col i.col
1:  B 105     1
2:  E 103    11
3:  G 101   111

问题原因:该写法本质是以new_big为基准的右连接,仅返回new_big中存在的id匹配行;且两个表存在同名列col时,data.table会自动为连接方(i位置的new_big)的同名列添加i.前缀做区分,不会自动替换原表列值。

正确实现方法

  • 方法1:原地更新(推荐,适合大数据量场景)
    使用data.table的按引用赋值运算符:=,直接在原big对象上修改匹配行的值,无全表复制开销,性能最优:
big[new_big, on = .(id), col := i.col]

运行后直接查看big即可得到期望结果,未匹配到id的行col值保持原有取值不变。

  • 方法2:生成新结果表(不修改原big对象)
    如果需要保留原始big对象不变,可以先复制原表再做更新,赋值给新的结果对象:
result <- copy(big)[new_big, on = .(id), col := i.col]

运行后result为期望的更新后表,原始big内容不发生改动。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:15:43