data.table滚动连接(roll join)中NA键未返回对应NA值的问题咨询
问题原因
- data.table的滚动连接依赖键的排序结果匹配记录,默认配置下
age字段的NA值会被排在数值序列的最前或最后端,执行roll='nearest'规则时,会自动匹配参考集x2里距离这个端点最近的age对应的yhat,因此不会返回空值。 - 滚动连接本身没有内置跳过NA连接键的逻辑,只要连接键在排序序列中存在对应位置,就会触发匹配规则。
修复方案
方案1:连接后批量修正(代码改动最小)
完成滚动连接后,直接将原age为NA的行对应的yhat强制赋值为NA即可:
library(data.table) # 原有连接逻辑不变 setkey(x1, age) setkey(x2, age) res <- x2[x1, roll = 'nearest'] # 新增修正逻辑 res[is.na(age), yhat := NA]
方案2:连接前拆分处理(性能更优,适合大数据集)
如果数据集体量较大,拆分处理可以减少无效连接的计算量:
# 拆分有age值和age缺失的两组 x1_valid <- x1[!is.na(age)] x1_missing <- x1[is.na(age)] # 仅对有效值组执行滚动连接 setkey(x1_valid, age) setkey(x2, age) res_valid <- x2[x1_valid, roll = 'nearest'] # 缺失组直接赋值yhat为NA后合并 x1_missing[, yhat := NA_real_] res <- rbind(res_valid, x1_missing)
内容的提问来源于stack exchange,提问作者mharinga
相关产品推荐
相关产品推荐

