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

请求指导:如何在R中按百分比汇总缺失值并生成新数据框

解决方案

你代码里的mean(is.na(.))其实已经算出了缺失值的小数占比(比如10%缺失返回0.1),如果要得到百分比数值(比如10),只需要乘以100即可:

na_count[2, ] <- df %>% summarise_all(~mean(is.na(.)) * 100)

要是需要带百分号的字符串格式(比如"10.00%"),可以这样写:

na_count[2, ] <- df %>% summarise_all(~paste0(round(mean(is.na(.)) * 100, 2), "%"))

但更建议保留数值型结果(方便后续计算或可视化),报表展示时再做格式化。

优化版代码(更高效简洁)

避免逐行赋值的繁琐,用tidyverse工具一次性生成目标报表:

library(dplyr)
library(tidyr)

# 替换成你的实际筛选条件,比如df$region == "华东"
filter_rows <- df$variable == "value"

# 一次性计算所有统计项
na_report <- df %>%
  summarise(
    across(
      .cols = everything(),
      .fns = list(
        总缺失数 = ~sum(is.na(.)),
        缺失占比 = ~mean(is.na(.)) * 100,
        指定层级缺失数 = ~sum(is.na(.)[filter_rows])
      )
    )
  ) %>%
  # 转换行列结构,匹配你的需求
  pivot_longer(everything(), names_sep = "_", into = c("变量名", "统计项")) %>%
  pivot_wider(names_from = 变量名, values_from = value) %>%
  # 设置行名为统计项(可选)
  column_to_rownames("统计项")

# 查看最终结果
na_report

这段代码的优势:

  • 一次计算所有需要的统计量,不用逐行手动赋值
  • 自动处理行列转换,直接得到「统计项为行、原数据列列为列」的报表结构
  • 代码可读性更强,后续新增统计项只需在.fns里添加即可

内容的提问来源于stack exchange,提问作者Jorge A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:25:30