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

R语言按组计算均值±2倍标准差及筛选ID的问题求助

解决R语言分组计算均值±2倍标准差及筛选异常ID问题

一、修正分组计算均值±2倍标准差的代码

你之前的错误主要有两点:一是最后一行的赋值语法完全错误,二是aggregate返回的是数据框,需要先对齐分组才能做运算。下面给出两种可行的方法:

方法1:Base R实现

# 按dose分组计算均值和标准差,用公式写法让列名更清晰
mean_df <- aggregate(distance ~ dose, data = data, FUN = mean, na.rm = TRUE)
sd_df <- aggregate(distance ~ dose, data = data, FUN = sd, na.rm = TRUE)

# 合并均值和标准差结果,按dose匹配
stats_df <- merge(mean_df, sd_df, by = "dose", suffixes = c("_mean", "_sd"))

# 计算均值±2倍标准差的数值范围,同时生成格式化字符串(保留2位小数更易读)
stats_df$lower_bound <- stats_df$distance_mean - 2 * stats_df$distance_sd
stats_df$upper_bound <- stats_df$distance_mean + 2 * stats_df$distance_sd
stats_df$mean_sd_label <- paste0(round(stats_df$distance_mean, 2), " ± ", round(2 * stats_df$distance_sd, 2))

方法2:dplyr包实现(更简洁高效)

如果你还没装dplyr,先运行install.packages("dplyr")安装:

library(dplyr)

stats_df <- data %>%
  group_by(dose) %>%
  summarise(
    distance_mean = mean(distance, na.rm = TRUE),
    distance_sd = sd(distance, na.rm = TRUE),
    lower_bound = distance_mean - 2 * distance_sd,
    upper_bound = distance_mean + 2 * distance_sd,
    mean_sd_label = paste0(round(distance_mean, 2), " ± ", round(2 * distance_sd, 2))
  ) %>%
  ungroup()

二、筛选超出范围的ID

需要把原始数据和分组统计结果合并,再判断每个distance是否超出对应dose的范围:

Base R实现

# 合并原始数据与统计量
data_merged <- merge(data, stats_df, by = "dose")

# 筛选出distance超出范围的记录
outlier_records <- data_merged[data_merged$distance < data_merged$lower_bound | 
                                data_merged$distance > data_merged$upper_bound, ]

# 提取唯一的异常ID(避免重复)
outlier_ids <- unique(outlier_records$ID)

dplyr实现

outlier_ids <- data %>%
  left_join(stats_df, by = "dose") %>%
  filter(distance < lower_bound | distance > upper_bound) %>%
  pull(ID) %>%
  unique()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:52:54