使用R purrr包映射未生成整洁数据,求解决方法
嘿,我明白你遇到的问题了——用purrr处理多列聚合时,结果变成了乱糟糟的多列,完全不是想要的整洁三列格式。别担心,我来帮你调整代码,搞定这个问题!
核心问题分析
你之前的代码应该是直接对每个分组变量单独聚合,然后用map_dfr拼接结果,这样每个变量的分组列和聚合列会被直接合并,导致列数爆炸。我们需要把每个变量的聚合结果统一成「预测变量-水平-聚合结果」的结构,再合并到一起,或者换一种更贴合tidyverse风格的写法。
解决方案1:用purrr的imap_dfr统一格式
这种方法保留你用purrr的习惯,同时给每个聚合结果添加变量名标识,再整理成统一列:
# 先加载需要的包 library(purrr) library(dplyr) # 定义你要用来分组的变量列表 group_vars <- c("cyl", "vs", "am") # 用imap_dfr遍历每个变量,同时获取变量名 tidy_result <- imap_dfr(group_vars, function(var, idx) { mtcars %>% # 把字符串变量名转为dplyr能识别的对象 group_by(!!sym(var)) %>% # 这里以计算mpg的均值为例,你可以换成自己的聚合逻辑 summarise(聚合结果 = mean(mpg)) %>% # 把分组列重命名为「水平」 rename(水平 = !!sym(var)) %>% # 添加「预测变量」列,记录当前是哪个变量 mutate(预测变量 = var) %>% # 调整列顺序为你想要的顺序 select(预测变量, 水平, 聚合结果) }) # 查看最终结果 print(tidy_result)
解决方案2:先转成长格式再聚合(更简洁)
如果你愿意稍微换个思路,用tidyr的pivot_longer先把数据转成长格式,再分组聚合,代码会更简洁,也更符合tidy数据的理念:
library(dplyr) library(tidyr) group_vars <- c("cyl", "vs", "am") tidy_result <- mtcars %>% # 保留要聚合的目标列(比如mpg)和所有分组变量 select(mpg, all_of(group_vars)) %>% # 把多个分组变量转成「预测变量」和「水平」两列 pivot_longer(cols = all_of(group_vars), names_to = "预测变量", values_to = "水平") %>% # 按预测变量和水平分组,执行聚合逻辑 group_by(预测变量, 水平) %>% summarise(聚合结果 = mean(mpg), .groups = "drop") print(tidy_result)
这两种方法最终都会输出你想要的三列:预测变量(记录是cyl/vs/am中的哪一个)、水平(对应变量的取值,比如cyl的4/6/8)、聚合结果(你计算的统计值)。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

