You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中可视化数据集中各列的空白占比?visdat包无法满足需求

展示数据集中空白/空格变量占比的可视化方案

这个问题我之前也碰到过!visdat确实只认传统的NA值,而空白字符串、全空格这类属于「隐性缺失值」,得先处理识别再可视化,给你两个实用的方案:

方案一:手动计算占比 + ggplot2 定制可视化

这个方案最灵活,能完全自定义图表样式,步骤很清晰:

  1. 先模拟一个带空白的测试数据集(方便你复现)
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)] <- ""
  1. 定义识别空白的函数
    要区分空字符串和全空格,用stringr::str_trim把两端空格去掉后判断是否为空:
library(stringr)

is_blank <- function(x) {
  # 只处理字符型列,非字符列不存在空白
  if (is.character(x)) {
    return(str_trim(x) == "")
  } else {
    return(FALSE)
  }
}
  1. 计算每列的空白占比并整理成可视化格式
# 计算每列空白占比(均值就是占比)
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))
  1. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:50:12