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

基于分组小计的计算列高效实现(R语言)

高效计算分组占比的R实现方案

问题背景

我有如下的频数dataframe:

data <- data.frame(id = c("1","2","3","4","5","6","7","8"),
                   level = c("high", "high", "high", "med", "med", "med", "low", "low"),
                   n = c(24, 48, 57, 79, 2, 69, 37, 82))

需要创建新列prop,计算每个观测值占对应level分组小计的百分比。当前实现方案需要手动为每个level分组计算小计,当level取值增多时代码会变得冗余:

high <- sum(data$n[data$level == "high"])
med <- sum(data$n[data$level == "med"])
low <- sum(data$n[data$level == "low"])

data$prop <- NA
data$prop[data$level == "high"] <- (data$n/high)*100
data$prop[data$level == "med"] <- (data$n/med)*100
data$prop[data$level == "low"] <- (data$n/low)*100

高效解决方案

方法1:Base R原生函数ave()

无需手动拆分分组,ave()可直接按指定分组计算统计量并匹配回原数据:

data$prop <- (data$n / ave(data$n, data$level, FUN = sum)) * 100
  • 核心逻辑:ave(data$n, data$level, FUN = sum)会为每个level分组计算n的总和,自动将结果按原数据长度重复填充,直接与原n列做除法即可得到占比。

方法2:Tidyverse工具集(dplyr)

用管道式分组操作,代码可读性更高,适配任意数量的分组:
先安装并加载dplyr(首次使用需安装):

install.packages("dplyr")
library(dplyr)

执行分组计算:

data <- data %>%
  group_by(level) %>%
  mutate(prop = (n / sum(n)) * 100) %>%
  ungroup()
  • 核心逻辑:group_by(level)按level分组,mutate()在分组内计算每个观测值的占比,ungroup()用于取消分组状态(可根据后续需求选择是否保留分组)。

以上两种方法均无需手动处理每个分组,能自动适配level的所有取值,大幅提升代码效率与可维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:50:25