如何通过引用更新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
相关产品推荐
相关产品推荐

