如何在R中可视化数据集中各列的空白占比?visdat包无法满足需求
展示数据集中空白/空格变量占比的可视化方案
这个问题我之前也碰到过!visdat确实只认传统的NA值,而空白字符串、全空格这类属于「隐性缺失值」,得先处理识别再可视化,给你两个实用的方案:
方案一:手动计算占比 + ggplot2 定制可视化
这个方案最灵活,能完全自定义图表样式,步骤很清晰:
- 先模拟一个带空白的测试数据集(方便你复现)
set.seed(123) df <- mtcars # 给部分列随机插入空白/空格 df$cyl[sample(1:nrow(df), 5)] <- "" df$disp[sample(1:nrow(df), 3)] <- " " df$hp[sample(1:nrow(df), 7)] <- ""
- 定义识别空白的函数
要区分空字符串和全空格,用stringr::str_trim把两端空格去掉后判断是否为空:
library(stringr) is_blank <- function(x) { # 只处理字符型列,非字符列不存在空白 if (is.character(x)) { return(str_trim(x) == "") } else { return(FALSE) } }
- 计算每列的空白占比并整理成可视化格式
# 计算每列空白占比(均值就是占比) blank_ratios <- sapply(df, function(col) { mean(is_blank(col), na.rm = TRUE) }) # 转成数据框并按占比降序排序,方便看图 blank_df <- data.frame( Variable = names(blank_ratios), Blank_Ratio = blank_ratios ) %>% dplyr::arrange(dplyr::desc(Blank_Ratio))
- 用ggplot2画条形图
library(ggplot2) ggplot(blank_df, aes(x = reorder(Variable, Blank_Ratio), y = Blank_Ratio)) + geom_bar(stat = "identity", fill = "#2E86AB", alpha = 0.8) + # 添加百分比标签 geom_text(aes(label = str_glue("{round(Blank_Ratio*100, 1)}%")), hjust = -0.1, size = 3.5) + # 翻转坐标轴,变量名更清晰 coord_flip() + labs(title = "各变量空白/空格占比", x = "变量名称", y = "空白占比") + theme_minimal() + theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
方案二:用naniar转换空白为NA,再用visdat展示
如果你习惯用visdat的风格,可以先用naniar把空白转换成NA,再让visdat识别:
library(naniar) library(visdat) # 将空白/空格转换为NA(这里要指定哪些列的哪些值是空白) df_na <- df %>% replace_with_na(replace = list(cyl = "", disp = " ", hp = "")) # 用vis_miss展示缺失值(含转换后的空白)占比 vis_miss(df_na, warn_large_data = FALSE) + labs(title = "各变量缺失值(含空白转换)占比")
注意要点
- 如果你的数据里有因子型列,需要先转换成字符型再处理空白,不然会报错;
- 可以根据实际情况调整
is_blank函数的判断逻辑,比如包含其他特殊空白格式; - 方案一的图表可以自由调整颜色、标签、排序,适合做汇报用的美观图表。
内容的提问来源于stack exchange,提问作者Data_is_Power
相关产品推荐
相关产品推荐

