如何在R中为mtcars数据集按am变量分组计算多变量频率百分比?
解决方法
原代码用的是基础R的apply,没法直接加dplyr::group_by——两者属于不同的代码范式,搭不上。要实现按am分层生成多个分类变量的频率表,用tidyverse工具组合更顺手,给你两种可行方案:
方案一:dplyr分组+跨列处理
先加载tidyverse,把目标变量转成因子(保证分类逻辑正确),再按am分组后批量计算每个变量的百分比频率:
library(tidyverse) mtcars %>% mutate(across(c(cyl, gear, carb), factor)) %>% group_by(am) %>% summarise( across(c(cyl, gear, carb), ~ { tbl <- table(.x, useNA = "always") prop.table(tbl) * 100 }) )
运行后会得到按am分组的结果,每个分组下对应cyl、gear、carb各自的百分比频率表。
方案二:转成长格式统一处理(输出更整洁)
如果想要更易读的表格形式,可以先把数据转成长格式,再分组计算:
library(tidyverse) mtcars %>% mutate(am = factor(am, labels = c("自动", "手动"))) %>% # 给am加标签更直观 pivot_longer(cols = c(cyl, gear, carb), names_to = "变量", values_to = "取值") %>% group_by(am, 变量) %>% count(取值, .drop = FALSE) %>% # 保留所有可能取值,包括NA mutate(百分比 = n / sum(n) * 100) %>% ungroup()
这种输出是长表格,每行对应一个am分组、一个变量、一个取值,以及对应的计数和百分比,方便后续查看或可视化。
补充说明
你原来的apply是逐列遍历数据框的基础R函数,而group_by是dplyr里的分组工具,需要配合管道(%>%)和tidy风格的函数使用,两者逻辑不兼容,所以没法直接在原代码里插入group_by语句。
内容的提问来源于stack exchange,提问作者four77
相关产品推荐
相关产品推荐

