如何快速定位数据融合过程中NA值的引入位置并统计各列NA数量?
如何快速定位数据融合过程中NA值的引入位置并统计各列NA数量?
嗨,我来帮你解决这个问题!你遇到的NA警告其实很好理解——就是有些字符串没法直接转成数值(比如df1里conc1列的<1.0),要定位哪列有多少NA其实很简单,给你几个实用的方法:
方法1:直接统计转换后各列的NA数量
先完成数据合并但暂时不转数值,等转换完成后直接统计每列的NA个数:
# 先完成合并,保留所有列的字符型格式 pm_temp <- full_join(df1 %>% mutate(across(everything(), as.character)), df2 %>% mutate(across(everything(), as.character)), by = c("ID", "depth" = "depth2", "conc1", "conc2"), .keep_all = TRUE) # 按需求转换目标列为数值型 pm <- pm_temp %>% mutate(across(all_of(num_vars_p), as.numeric)) # 统计每列的NA数量 na_stat <- pm %>% summarize(across(everything(), ~ sum(is.na(.x)))) print(na_stat)
运行后你会看到清晰的结果,比如这里conc1列会显示1个NA,就是来自df1里的<1.0这个值。
方法2:提前预判哪些值会产生NA(更高效)
如果不想先转换整个数据框,想提前知道哪些列会生成NA以及具体数量,可以用这个自定义小函数:
count_na_from_coercion <- function(data, target_cols) { data %>% summarize(across(all_of(target_cols), ~ sum(is.na(as.numeric(.x))))) %>% # 转成长格式,只显示有NA的列,结果更直观 pivot_longer(everything(), names_to = "列名", values_to = "NA数量") %>% filter(`NA数量` > 0) } # 用合并后的临时数据框调用函数 count_na_from_coercion(pm_temp, num_vars_p)
这个函数会直接返回有NA的列名和对应的数量,不用先修改原数据,非常方便。
额外小提示
你定义的num_vars_p是基于df1的,其实可以改成基于合并后的pm_temp,这样如果合并后出现新的符合条件的列也能自动覆盖到:
num_vars_p <- names(pm_temp %>% select_if(function(x) sum(grepl("<[0-9]", x)) > 0 | is.character(x)))
不过你的场景里合并后列和df1一致,所以影响不大~
备注:内容来源于stack exchange,提问作者Lieke
相关产品推荐
相关产品推荐

