生成包含NA值的比例表:按类别计算1的占比
计算R语言数据框中分组的比例
首先先确认你的原始数据构造代码:
cc = c("i", "am", "useless", 0, 2, 4, 5) aa = c("red", "blue", "red", "red", "blue", "green", "green") bb = c(1, 1, 0, NA, 1, 1, 0) data <- data.frame(aa, bb, cc)
你的需求是:计算aa列每个唯一类别中,bb列值为1的元素占该类别总数量的比例,最终得到类似这样的分数形式结果:
propOf1 red 1/3 blue 1 green 1/2
下面提供两种实用的实现方法:
方法一:使用Base R
不需要额外安装包,用aggregate函数就能完成分组计算,再借助MASS包的fractions函数把小数转成分数格式:
# 先加载MASS包(如果没安装先运行install.packages("MASS")) library(MASS) # 分组计算比例 result <- aggregate(bb ~ aa, data = data, FUN = function(x) { # 统计每个组的总行数(包含NA) total_rows <- length(x) # 统计每个组中bb=1的数量(忽略NA) count_ones <- sum(x == 1, na.rm = TRUE) # 计算比例并转成分数 fractions(count_ones / total_rows) }) # 调整列名和输出格式,匹配你的需求 colnames(result) <- c("", "propOf1") print(result, row.names = FALSE)
运行后就能得到你想要的输出:
propOf1 red 1/3 blue 1 green 1/2
方法二:使用dplyr包(tidyverse风格)
如果你习惯用tidyverse的语法,dplyr的分组汇总更简洁直观:
# 先加载dplyr包(如果没安装先运行install.packages("dplyr")) library(dplyr) library(MASS) # 同样用来转分数 result <- data %>% group_by(aa) %>% summarise(propOf1 = fractions(sum(bb == 1, na.rm = TRUE) / n())) %>% rename(` ` = aa) # 重命名第一列,去掉列名 # 输出结果 print(result, row.names = FALSE)
这里的n()会自动计算每个分组的总行数,sum(bb == 1, na.rm = TRUE)精准统计每个组里bb为1的数量,最后用fractions()把比例转成易读的分数形式。
内容的提问来源于stack exchange,提问作者S31
相关产品推荐
相关产品推荐

