data.table条件关联:仅替换x为NA行的UsedSite字段
解决data.table中仅替换缺失值行的UsedSite字段问题
我有一个含少量缺失值(实际占比<1%)的数据集,计划用其他站点的数据填充缺失值。现有data.table对象dt1存储数据,另一个data.table对象dt2是站点替换索引(rsite字段为可替换缺失值的站点)。需在dt1中创建UsedSite字段,记录最终使用数据的来源站点。
构造示例数据
dt1 <- data.table(site=c("s1","s1","s2","s2"), x=c(NA, 1, NA,1)) dt2 <- data.table(site=c("s1","s1","s2","s2"), rsite=c("s3","s3","s4","s4"))
初始化UsedSite字段
先将UsedSite初始化为site字段:
dt1[, UsedSite := site]
问题点
直接执行dt1[dt2, UsedSite:=rsite, on=.(site)]会替换所有行,尝试dt1[dt2&is.na(x), UsedSite:=rsite, on=.(site)]不符合data.table语法,无法生效。
解决方案
以下两种方法均符合data.table范式,可实现仅替换x为NA行的UsedSite:
方法1:筛选缺失值行后匹配替换
先筛选出x为NA的行,再与dt2按site连接获取对应rsite:
dt1[is.na(x), UsedSite := dt2[.SD, rsite, on = .(site)]]
- 逻辑:
dt1[is.na(x)]定位目标行,.SD代表该子集,通过site匹配dt2的rsite完成赋值。
方法2:连接后条件赋值
全表连接dt1与dt2,用fifelse做条件判断,仅替换缺失值行:
dt1[dt2, UsedSite := fifelse(is.na(x), rsite, UsedSite), on = .(site)]
- 逻辑:连接后对每一行判断,若
x为NA则用rsite替换UsedSite,否则保留原值。
验证结果
执行任意一种方法后,dt1的输出为:
site x UsedSite 1: s1 NA s3 2: s1 1 s1 3: s2 NA s4 4: s2 1 s2
内容的提问来源于stack exchange,提问作者TBP
相关产品推荐
相关产品推荐

