如何在R中按列移除异常值(仅删异常值不删整行)
按列替换异常值(保留整行)的实现方案
1. 构造示例数据框
先把你提供的数据转换成R可处理的格式:
library(dplyr) df <- tibble( IQ = c(105, 40, 70, 150, 148, 115, 110, 120, 99, 1000, 70), sleep = c(70, 50, 20, 150, 60, 10, 90, 40, 30, 15, 60), GRE = c(200, 150, 70, 80, 900, 1200, 15, 60, 70, 30, 12), happiness = c(15, 15, 10, 6, 7, 40, 5, 12, 15, 68, 70) )
2. 定义异常值替换逻辑
按照你「大于mean+3sd或小于mean-3sd为异常值」的规则,自定义一个替换函数,把异常值转为NA(即仅删除该值,保留整行其他数据):
replace_outliers <- function(x) { # 计算列的均值和标准差(忽略已有NA) col_mean <- mean(x, na.rm = TRUE) col_sd <- sd(x, na.rm = TRUE) # 计算异常值上下边界 lower_bound <- col_mean - 3 * col_sd upper_bound <- col_mean + 3 * col_sd # 替换异常值为NA ifelse(x < lower_bound | x > upper_bound, NA, x) }
3. 应用到所有列
用dplyr的mutate()结合across(),把函数应用到数据框的每一列:
df_cleaned <- df %>% mutate(across(everything(), replace_outliers)) # 查看处理后的结果 print(df_cleaned)
4. 针对特定列处理(可选)
如果只需要处理部分列(比如仅处理IQ和GRE),只需修改across()的参数:
df_cleaned_partial <- df %>% mutate(across(c(IQ, GRE), replace_outliers))
内容的提问来源于stack exchange,提问作者Raze
相关产品推荐
相关产品推荐

