如何使用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
相关产品推荐
相关产品推荐

