如何计算数据框(df)所有列中'>1'水平的占比
问题分析与解决方法
报错原因
你用prop.table(table(df))报错是因为table(df)会生成所有列的交叉列联表,24列每列3个水平,总元素数为324,这个数值远超过231(约21亿)的内存上限,所以触发了创建超大表格的错误。
正确计算每列'>1'占比的方法
我们不需要生成交叉表,直接针对每列单独计算'>1'水平的占比即可,以下是两种高效实现方式:
方法1:基础R的sapply函数
# 遍历每列计算'>1'的占比,na.rm=TRUE处理可能的缺失值 greater_1_ratio <- sapply(df, function(col) { mean(col == ">1", na.rm = TRUE) }) # 转换为易读的数据框格式 result_table <- data.frame( 列名称 = names(greater_1_ratio), ">1水平占比" = round(greater_1_ratio, 4) # 保留4位小数,可按需调整 )
方法2:tidyverse工具链(dplyr+tidyr)
如果习惯用tidyverse语法,可这样实现:
library(dplyr) library(tidyr) result_table <- df %>% # 对所有列计算'>1'的占比 summarise(across(everything(), ~ mean(.x == ">1", na.rm = TRUE))) %>% # 转换为长格式表格 pivot_longer(everything(), names_to = "列名称", values_to = ">1水平占比") %>% # 格式化占比数值 mutate(`>1水平占比` = round(`>1水平占比`, 4))
原理说明
mean(col == ">1")等价于sum(col == ">1") / length(col),直接统计每列中'>1'的行数占总行数的比例,无需生成庞大的交叉表,内存占用极低,计算效率很高。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

