如何通过ID与姓名的匹配关系批量填充dataframe中的缺失值
不需要逐行遍历,使用ID与姓名的映射匹配即可实现高效填充,50万行规模可秒级完成,操作方案如下:
前置处理
首先将姓名列中的空字符串、空白值统一转换为标准NA值,方便后续匹配:
df$Names[trimws(df$Names) == ""] <- NA
步骤1:构建唯一映射表
提取所有ID和姓名均非空的行,去重得到ID到姓名的唯一映射关系:
# 生成初始映射表 name_map <- unique(df[!is.na(df$Names) & !is.na(df$ID), c("ID", "Names")]) # 去重保证每个ID仅对应一个姓名,若存在同ID多姓名冲突可在此处自定义处理逻辑 name_map <- name_map[!duplicated(name_map$ID), ]
可选:冲突校验
如果需要确认是否存在同一个ID对应多个不同姓名的异常情况,可运行以下代码检查:
library(dplyr) conflict_cnt <- name_map %>% count(ID) %>% filter(n > 1) %>% nrow() # 若conflict_cnt大于0,说明存在映射冲突,需要先清理异常数据再进行填充
步骤2:批量填充缺失值
方法1:Base R实现
df$Names <- ifelse( is.na(df$Names), name_map$Names[match(df$ID, name_map$ID)], df$Names )
方法2:dplyr实现(可读性更高)
library(dplyr) df <- df %>% left_join(name_map, by = "ID", suffix = c("", "_map")) %>% mutate(Names = coalesce(Names, Names_map)) %>% select(-Names_map)
补充说明
如果同时存在ID缺失、姓名存在的场景,只需反过来构建姓名→ID的映射表,用同样的逻辑填充缺失的ID即可。
内容的提问来源于stack exchange,提问作者McMahok
相关产品推荐
相关产品推荐

