如何批量将匹配观测的非NA值填充至数据框多变量NA位置?
解决方案
方法1:data.table批量赋值(高效直接)
通过遍历需要填充的变量列,结合data.table的连接赋值语法,实现批量填充:
library(data.table) setDT(df) # 筛选出需要填充的变量(排除标识符列) fill_cols <- setdiff(names(df), c("URN", "OBS")) # 批量填充每个变量 lapply(fill_cols, function(col) { df[df[!is.na(get(col))], (col) := get(paste0("i.", col)), on = c("URN", "OBS")] }) # 查看结果 df
这段代码会自动对每个目标变量,匹配URN和OBS相同的观测,用非NA值覆盖对应位置的NA。
方法2:分组聚合后合并(适合数据逻辑明确的场景)
如果每个URN+OBS组内同一变量的非NA值一致,可以先分组提取非NA值,再合并回原数据框:
library(data.table) setDT(df) fill_cols <- setdiff(names(df), c("URN", "OBS")) # 按URN和OBS分组,提取每个变量的首个非NA值(确保组内非NA值唯一) agg_df <- df[, lapply(.SD, function(x) x[!is.na(x)][1]), by = .(URN, OBS), .SDcols = fill_cols] # 合并回原数据框,批量填充NA df[agg_df, on = c("URN", "OBS"), (fill_cols) := mget(paste0("i.", fill_cols))] df
这种方法的优势是先统一每个组的变量值,再一次性填充,适合组内非NA值无冲突的情况。
内容的提问来源于stack exchange,提问作者surdity
相关产品推荐
相关产品推荐

