在R中使用dplyr识别多列缺失的唯一值并定位问题行
解决方法(基于dplyr)
假设你的数据集名为df,按以下步骤操作:
1. 验证各列唯一值数量(可选)
先确认你统计的唯一值数量是否准确:
df %>% summarize( 唯一common_name数 = n_distinct(common_name), 唯一speciesID数 = n_distinct(speciesID), 唯一species数 = n_distinct(species) )
2. 找出speciesID缺失的2个common_name值
核心是对比所有common_name唯一值和有对应非空speciesID的common_name唯一值,找出前者有但后者没有的项:
# 提取所有唯一的common_name all_common <- df %>% distinct(common_name) # 提取有非空speciesID对应的唯一common_name id_connected_common <- df %>% filter(!is.na(speciesID)) %>% distinct(common_name) # 找出speciesID缺失的common_name(共2个) missing_id_names <- anti_join(all_common, id_connected_common, by = "common_name")
3. 找出species缺失的3个common_name值
用同样逻辑对比common_name和species的对应关系:
# 提取有非空species对应的唯一common_name species_connected_common <- df %>% filter(!is.na(species)) %>% distinct(common_name) # 找出species缺失的common_name(共3个) missing_species_names <- anti_join(all_common, species_connected_common, by = "common_name")
4. 定位对应的问题行
直接筛选出属于上述缺失名称的行,就能看到具体是哪些记录出了问题:
# 定位speciesID缺失的问题行 problem_rows_id <- df %>% filter(common_name %in% missing_id_names$common_name) # 定位species缺失的问题行 problem_rows_species <- df %>% filter(common_name %in% missing_species_names$common_name)
关于之前anti_join失败的原因
大概率是没提前过滤NA值,或者直接用全量数据集而非唯一值集合做join——全量数据里的重复值会干扰对比结果,先提取唯一值再做anti_join才能精准定位缺失项。
内容的提问来源于stack exchange,提问作者Blundering Ecologist
相关产品推荐
相关产品推荐

