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

