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

R语言基于100次随机抽样结果绘制多物种箱线图问题

问题原因
  1. 你在循环内每次抽样完成后直接调用绘图函数,所以仅能生成单次抽样的箱线图,没有用到全部100次的抽样数据
  2. 用[,2:5]硬编码列索引的方式不稳健,一是列顺序变动就会失效,二是你这里漏选了species_5(物种列实际是第2到第6列,共5个物种)
  3. 基础绘图系统的boxplot()返回的是统计量列表,不是ggplot对象,直接加theme()语法会报错
优化实现方案

我们先完成全部100次抽样、合并所有抽样数据后再统一绘图,同时用列名匹配的方式筛选物种列,更稳健。

首先加载所需依赖包:

library(tidyverse)

完整实现代码:

# 先解分组,避免分组数据抽样异常
homer_cpue_wide <- ungroup(homer_cpue_wide)
n_simu <- 100 # 抽样次数
sample_size <- 5 # 每次抽样点位数量

# 完成全部抽样,合并所有数据
all_sample <- map_dfr(1:n_simu, function(sim_id){
  # 无放回抽5个点位
  sample_idx <- sample(1:nrow(homer_cpue_wide), sample_size, replace = FALSE)
  homer_cpue_wide[sample_idx, ] %>%
    mutate(sim_id = sim_id) # 标记属于第几次抽样
})

# 转长格式,筛选需要的物种列,用列名匹配避免硬编码索引
plot_data <- all_sample %>%
  select(sim_id, starts_with("species_")) %>%
  pivot_longer(cols = -sim_id, names_to = "species", values_to = "cpue")

# 绘制箱线图
ggplot(plot_data, aes(x = species, y = cpue)) +
  geom_boxplot(na.rm = TRUE) +
  labs(x = "物种", y = "CPUE估计值") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
代码说明
  • 用ungroup()先解除原数据的分组结构,避免抽样时出现非预期的分组抽样问题
  • 用starts_with("species_")匹配物种列,只要列名符合前缀规则就能正确选中,不受列顺序影响
  • 用map_dfr替代for循环完成抽样,直接合并所有抽样结果为一个数据框,不用手动维护列表
  • 最后统一用长格式数据绘图,每个箱线图自动对应该物种全部100次抽样的所有观测值

内容的提问来源于stack exchange,提问作者hugh_man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:06:03