如何在首列值与列名均匹配时,从另一data.table为目标表赋值
匹配data.table并填充缺失值
我有两个结构相似的data.table,想要在第一列值匹配且列名一致的情况下,从第一个表提取对应值填充第二个表的NA位置。用mtcars数据集生成的示例代码如下:
library(tibble) library(data.table) # 生成第一个带car列的data.table mtcars_first <- add_column(mtcars, car = rownames(mtcars), .before = 1) # 生成第二个待填充的data.table mtcars_second <- rbind( c("Hornet 4 Drive",NA,NA,NA), c("Valiant",NA,NA,NA), c("Duster 360" ,NA,NA,NA)) %>% as.data.table() colnames(mtcars_second) <- c("car","disp","drat","qsec")
解决方案
用data.table的更新连接可以高效完成这个需求,无需额外合并后再处理:
手动指定列名的写法
# 匹配car列,将mtcars_first的对应列值赋值给mtcars_second mtcars_second[mtcars_first, on = "car", c("disp", "drat", "qsec") := .(i.disp, i.drat, i.qsec)]
自动匹配列名的灵活写法
如果待填充的列很多,不需要手动列出来,用setdiff获取除了匹配键(car)之外的列名,再批量赋值:
# 获取需要填充的列名(排除car列) fill_cols <- setdiff(names(mtcars_second), "car") # 批量填充对应列的值 mtcars_second[mtcars_first, on = "car", (fill_cols) := mget(paste0("i.", fill_cols))]
执行后查看mtcars_second,就能看到NA已经被替换成mtcars_first中对应car的数值了。
内容的提问来源于stack exchange,提问作者Zach Fara
相关产品推荐
相关产品推荐

