如何按单列分组统计另一列特定值占比,有更高效的R实现方法吗?
高效实现方案
你原来的实现需要多次拆分数据集、分组计算再关联,大数据量下会产生大量不必要的性能开销。只需要一次分组即可完成计算,核心逻辑是利用R中逻辑值的数值属性(TRUE对应1,FALSE对应0),对cyl == 6的判断结果求均值,就是该取值在分组内的占比:
library(dplyr) # 示例数据准备(修正原group列赋值的不规范写法,避免长度不匹配的隐式循环风险) dat <- mtcars %>% filter(cyl >=6) %>% mutate(group = rep(1:3, length.out = n())) # 一步计算占比 cyl_data <- dat %>% group_by(group) %>% summarise( six_cyl_prop = mean(cyl == 6), .groups = "drop" )
如果需要同时保留两个取值的计数,也可以在同一次分组中完成:
cyl_data <- dat %>% group_by(group) %>% summarise( count_6 = sum(cyl == 6), count_8 = sum(cyl == 8), six_cyl_prop = count_6/(count_6 + count_8), .groups = "drop" )
以上方案仅对数据集做1次遍历分组计算,没有多余的拆分、关联操作,性能远高于你当前的实现,数据量级越大优势越明显。
如果你的数据集规模极大,还可以使用data.table实现进一步的性能提升:
library(data.table) # 转换为data.table格式 setDT(dat) # 按group分组计算占比 cyl_data <- dat[, .(six_cyl_prop = mean(cyl == 6)), by = group]
内容的提问来源于stack exchange,提问作者Tjn25
相关产品推荐
相关产品推荐

