如何用purrr按cyl分组计算mtcars各变量均值?
解决方法
你遇到的问题核心是:map_df(~mean(.x, na.rm = TRUE)) 里的 .x 是每个分组对应的完整数据框,而 mean() 直接接收数据框时,无法按预期生成各列均值的结构化结果,还会触发类型不兼容的错误。
正确的做法是,对每个分组的数据框,先遍历它的每一列(即单个变量),再对列向量应用 mean()。用purrr实现需要嵌套使用 map 函数:
- 先按
cyl拆分数据集为列表(每个元素是对应cyl的子数据框):
library(purrr) by_cyl <- split(mtcars, mtcars$cyl)
- 对每个子数据框,遍历所有列计算均值,再组合成结果数据框:
mean_by_cyl <- by_cyl %>% map_df(~map_dbl(.x, mean, na.rm = TRUE), .id = "cyl")
map_dbl(.x, mean, na.rm = TRUE):遍历当前分组的子数据框.x的每一列,对列向量计算均值,返回一个数值向量- 外层的
map_df():将每个分组的均值向量组合成完整的数据框,.id = "cyl"参数会自动添加分组标识列,方便区分不同cyl的结果
如果习惯结合dplyr使用,也可以用更直观的写法(本质还是调用purrr的逻辑):
library(dplyr) library(purrr) mtcars %>% group_split(cyl) %>% map_df(~summarize_all(.x, mean, na.rm = TRUE), .id = "cyl")
这样就能得到按cyl分组后,各变量的均值结果。
内容的提问来源于stack exchange,提问作者menomale
相关产品推荐
相关产品推荐

