You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中使用purrr的map2绘图时,group_by参数为何失效?

按Level生成单张绘图的问题解决方法

问题背景

需要按学生的level生成4张绘图(每个level对应一张,包含该层级所有学生数据),但当前代码执行后生成了16张绘图(每个学生对应一张),以下是问题分析和修正方案。

原始尝试代码

# 数据准备
library(dplyr)
my_data <- tibble(level = c(rep(c("Kindergarten", "1st", "2nd", "3rd"), 4)),
                  id = c(1:16),
                  score = c(81:96))
# 生成绘图的尝试代码
library(purrr)
library(stringr)
library(ggplot2)

# 提取信息
levels <- my_data %>% pull(level) %>% as.character
scores <- my_data %>% pull(score)

# 生成绘图
my_plots <- map2(
  .x = levels,
  .y = scores,
  .f = ~{
    my_data %>%
      group_by(level) %>% # 此处分组未生效
      ggplot(aes(x = .x, y = .y)) +
      geom_point() +
      ggtitle(str_glue("Score by {.x}"))
  }
)

my_plots # 生成了16张图而非预期的4张

错误原因

  1. map2的输入是长度为16的levels和scores向量,会循环16次(对应每一行数据),每次仅处理单个学生的level和score,因此生成16张图。
  2. group_by(level)未起到作用:绘图时直接使用了.x和.y(单个值),并未基于分组后的完整数据集进行可视化。

修正方案

方案一:遍历唯一Level值并筛选数据

library(dplyr)
library(purrr)
library(stringr)
library(ggplot2)

# 原始数据
my_data <- tibble(level = c(rep(c("Kindergarten", "1st", "2nd", "3rd"), 4)),
                  id = c(1:16),
                  score = c(81:96))

# 获取所有唯一的level值
unique_levels <- unique(my_data$level)

# 按每个level生成绘图
my_plots <- map(
  .x = unique_levels,
  .f = ~{
    # 筛选当前level的所有学生数据
    filtered_data <- my_data %>% filter(level == .x)
    
    ggplot(filtered_data, aes(x = level, y = score)) +
      geom_point(size = 2) + # 可选:调整点大小提升可读性
      ggtitle(str_glue("Score by {.x}")) +
      theme_minimal()
  }
)

# 查看结果(共4张图,每张对应一个level)
my_plots

方案二:用group_split拆分数据集后遍历

library(dplyr)
library(purrr)
library(stringr)
library(ggplot2)

# 原始数据
my_data <- tibble(level = c(rep(c("Kindergarten", "1st", "2nd", "3rd"), 4)),
                  id = c(1:16),
                  score = c(81:96))

# 按level拆分数据为4个数据框的列表
level_data_list <- my_data %>% group_split(level)

# 遍历每个子数据集生成绘图
my_plots <- map(
  .x = level_data_list,
  .f = ~{
    current_level <- .x$level[1] # 获取当前level名称
    ggplot(.x, aes(x = level, y = score)) +
      geom_point(size = 2) +
      ggtitle(str_glue("Score by {current_level}")) +
      theme_minimal()
  }
)

my_plots

说明

两种方案均会生成4张绘图,每张图包含对应level下所有学生的分数数据:

  • 方案一通过unique()获取唯一层级,再筛选对应数据绘图,逻辑清晰直观。
  • 方案二用group_split直接拆分数据集,避免手动筛选,代码更简洁。

内容的提问来源于stack exchange,提问作者J.Sabree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:50:26