如何获取异常值索引?多变量异常值移除的优化实现问询
解决方案
你可以一次性计算所有目标变量的75%分位数,生成逻辑判断标记异常观测,再通过索引筛选保留正常数据,避免分步过滤的累积删除问题。
基础实现代码
# 加载dplyr包 library(dplyr) # 计算目标变量的75%分位数(na.rm处理缺失值) q_age <- quantile(CD$AGE, probs = 0.75, na.rm = TRUE) q_amount <- quantile(CD$AMOUNT, probs = 0.75, na.rm = TRUE) # 标记异常观测的索引:AGE或AMOUNT超过对应分位数即视为异常 outlier_indices <- which(CD$AGE > q_age | CD$AMOUNT > q_amount) # 保留非异常观测 CD_clean <- CD[-outlier_indices, ]
多变量批量处理方式
如果需要处理多个变量,用across函数可以更高效地批量操作:
# 定义需要检查的变量列表 vars_to_check <- c("AGE", "AMOUNT") # 批量计算各变量的75%分位数 quantiles <- sapply(CD[vars_to_check], quantile, probs = 0.75, na.rm = TRUE) # 生成异常判断:任意变量超过对应分位数则标记为异常 is_outlier <- CD %>% mutate(across(all_of(vars_to_check), ~ .x > quantiles[cur_column()])) %>% rowSums(.) > 0 # 获取异常索引并筛选正常数据 CD_clean <- CD[!is_outlier, ]
注意事项
- 代码中用
|(逻辑或)判断异常:只要任意一个变量超标就算异常。如果需要严格判断(所有变量都超标才算异常),把|换成&即可。 na.rm = TRUE用于处理数据中的缺失值,避免分位数计算报错。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

