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

如何使用R移除分组数据中箱线图识别的异常值

移除分组箱线图中的异常值(R实现)

核心思路

箱线图的异常值定义为超出四分位距(IQR)1.5倍范围的数值,即小于Q1-1.5*IQR或大于Q3+1.5*IQR的观测。我们可以按性别分组计算这个范围,再筛选出非异常数据。

具体代码实现

步骤1:加载原始数据

weight<-c(117,  118,    125,    86,     131,     93,    103,    107,    112,    97, 105,    105,    111,    105,    124,    111,    103,    113,    112,    127,    111,    115,    108,    105,    108,    127,    148,    131,    126,    119,    131,    134,    127,    139,    106,    133,    139,    125,    127,    127,    113,    135,    113,    131,    145,    147,    139,    136)
gender<-c(1,    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2)
data<-data.frame(weight,gender)

步骤2:筛选非异常值

方法1:用基础R快速实现

利用boxplot.stats()直接提取每组异常值,再过滤:

# 处理男性组(gender=1)
male_outliers <- boxplot.stats(data$weight[data$gender==1])$out
data_clean <- data[!(data$gender==1 & data$weight %in% male_outliers), ]

# 处理女性组(gender=2)
female_outliers <- boxplot.stats(data$weight[data$gender==2])$out
data_clean <- data_clean[!(data$gender==2 & data$weight %in% female_outliers), ]

方法2:用dplyr分组处理(更清晰)

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

library(dplyr)

data_clean <- data %>%
  group_by(gender) %>%
  mutate(
    q1 = quantile(weight, 0.25),
    q3 = quantile(weight, 0.75),
    iqr = q3 - q1,
    lower = q1 - 1.5*iqr,
    upper = q3 + 1.5*iqr,
    is_outlier = weight < lower | weight > upper
  ) %>%
  filter(!is_outlier) %>%
  select(-q1, -q3, -iqr, -lower, -upper, -is_outlier) %>%
  ungroup()

步骤3:验证清洗结果

绘制清洗后的箱线图,确认异常值已移除:

boxplot(weight ~ gender, data = data_clean, names = c("Male", "Female"), col = topo.colors(6))

注意事项

移除异常值前请先确认:这些值是数据录入错误还是真实存在的极端观测,避免误删有效数据。

内容的提问来源于stack exchange,提问作者Kazi Fayzus Salahin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:55:25