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

生成包含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:08:18