R语言group_by分组后计算满足条件行占比的最优实现方法
原生实现方案
你要计算的是同一天气分组下,不同运动的计数占当前天气总计数的比例,利用dplyr的分组层级特性就能直接实现,无需额外自定义函数,避免了冗余的全表过滤操作,效率远高于原有实现。
方案1:纯dplyr管道实现(最常用)
library(dplyr) data %>% # 先按天气做一级分组 group_by(weather) %>% # 统计当前天气下每个运动对应的天数 count(sport, name = "days") %>% # 直接计算占比:sum(days)就是当前天气分组的总天数 mutate(percentage = days / sum(days))
如果需要输出百分比格式,可以额外加一行调用scales包的格式化函数:
mutate(percentage = scales::percent(percentage, accuracy = 0.1))
方案2:base R原生实现(无需加载第三方包,效率最高)
直接用基础函数生成按天气维度计算的占比交叉表:
# margin=1 指定按行(天气维度)计算占比,每行求和结果为1 prop.table(table(data$weather, data$sport), margin = 1)
方案3:分组后直接汇总实现
如果需要保留group_by(weather, sport)的写法,可以用.groups参数控制分组保留层级:
data %>% group_by(weather, sport) %>% summarise(count = n(), .groups = "drop_last") %>% # drop_last会保留weather层级的分组,sum(count)即对应天气的总天数 mutate(percentage = count / sum(count))
内容的提问来源于stack exchange,提问作者coderboi
相关产品推荐
相关产品推荐

