R语言中基于重复匹配数据的缺失NA值查找与补全方法问询
数据集缺失值统计与补全解决方案
前提说明
我们默认同一姓名、兄弟数量、姐妹数量的记录属于同一个人的重复录入,如果你的数据集还有其他可确定唯一身份的字段,可以加入后续的分组逻辑提高匹配准确率。
1. 可匹配NA缺失值的统计与列表生成
统计可匹配的NA数量
这里的可匹配NA指的是:同一分组下同时存在Children有效值和NA的情况,对应的R代码示例如下:
library(tidyverse) # 读入数据,实际使用时替换为你的数据集读入语句 df <- read.table(text = " Name Brothers Sisters Children John 2 1 2 James 1 0 1 Joshua 4 1 4 James 0 0 0 John 2 1 NA Willian 1 1 1 Peter 2 2 0 James 1 0 NA Micahel 2 1 2 ", header = T) # 计算符合要求的NA数量 matchable_na_num <- df %>% # 按唯一身份字段分组 group_by(Name, Brothers, Sisters) %>% # 筛选同时存在有效值和NA的分组 filter(any(!is.na(Children)) & any(is.na(Children))) %>% ungroup() %>% # 仅保留NA行统计数量 filter(is.na(Children)) %>% nrow()
生成人工修正用的缺失值列表
你可以直接导出附带参考值的列表用于人工校验修改:
na_fix_list <- df %>% group_by(Name, Brothers, Sisters) %>% # 新增同组有效值作为参考列 mutate(reference_children = max(Children, na.rm = T)) %>% filter(any(!is.na(Children)) & any(is.na(Children))) %>% ungroup() %>% filter(is.na(Children)) %>% select(Name, Brothers, Sisters, reference_children) # 导出为csv文件 write.csv(na_fix_list, "待修正缺失值列表.csv", row.names = F)
2. 自动补全可匹配的NA值
前置校验
自动补全的前提是同一分组下的Children有效值唯一,你可以先校验是否存在冲突:
# 校验是否存在同一分组有多个不同Children有效值的情况 conflict_groups <- df %>% group_by(Name, Brothers, Sisters) %>% filter(!is.na(Children)) %>% summarise(children_unique = n_distinct(Children) == 1) %>% filter(children_unique == F)
如果返回结果为空,说明没有冲突,可以安全执行自动补全。
自动补全代码
df_filled <- df %>% group_by(Name, Brothers, Sisters) %>% # 同一分组下的NA用同组有效值填充 mutate(Children = ifelse(is.na(Children), max(Children, na.rm = T), Children)) %>% ungroup()
如果存在冲突分组,建议先单独提取这些分组人工确认数值后再进行补全操作。如果你使用Python pandas处理数据,上述逻辑完全通用,只需要替换为pandas的groupby+transform语法即可实现相同效果。
内容的提问来源于stack exchange,提问作者Ajrhjnd
相关产品推荐
相关产品推荐

