请求指导:如何在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
相关产品推荐
相关产品推荐

