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

如何通过引用更新data.table连接中的右表(i)?

如何按引用更新data.table右表i

新版《data.table连接》文档的最后一节介绍了如何使用x[i,on=.(id),...]的合并语法按引用更新左表(相关Stack Overflow问题可参考),简化示例如下:

x = data.table(id = 1:5, newvar1=LETTERS[1:5], newvar2=5:1)
# 实际场景中x会包含更多变量:newvar2,...,newvarN
i = data.table(id = 1:7, var1 = c('bla','ble','bli','blo','blu','blA','blS') )

# 按引用更新左表
x[i,on = .(id),
  j = `:=`(id=id,var1=var1,newvar1=newvar1)]

# 结果:来自i的var1列被按引用添加到x中
print(x)
id newvar1   var1
<int> <char> <char>
1:     1      A    bla
2:     2      B    ble
3:     3      C    bli
4:     4      D    blo
5:     5      E    blu

我需要实现相反的操作:按引用更新右表i。

x = data.table(id = 1:5, newvar1=LETTERS[1:5])
# 实际场景中x会包含更多变量:newvar2,...,newvarN 
i = data.table(id = 1:7,var1 = c('bla','ble','bli','blo','blu','blA','blS'))

# 右连接后覆盖i的内容(此操作会复制整个i表)
i <- x[i,on = .(id)]

是否存在按引用完成此操作的方法?

在实际应用中,i是包含数百万条观测、数十列的主数据集,我需要向其中添加来自x的newvar1、newvar2……newvarN等变量,同时必须保留i的列和行(基数),而非x的。

直接覆盖i会涉及复制操作,这会导致内存占用激增(约翻倍),可能超出可用内存并导致R崩溃。

我当前的解决方案如下:

i_id <- i[,.(id)]     # 创建仅含id变量的辅助data.table
i_id <- x[i_id,on=id] # 仍会复制,但仅复制id列和来自x的列(而非i的数百列)
i[,newvar1:=i_id$newvar1]
i[,newvar2:=i_id$newvar2]
...
i[,newvarN:=i_id$newvarN]   # 此方法可行,但当N较大时代码冗长且易出错

更新1:我已在data.table的GitHub仓库提交了相关issue。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:23:15