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

R语言按分组变量检测离群值并新增标识列实现方案

R语言分组离群值标识实现方法

核心判定逻辑

  • 按Item字段拆分分组
  • 对每条记录,计算排除当前记录后同组其余Cost值的均值(即规则所指的多数值均值,避免离群值本身拉高/拉低均值造成判定偏差)
  • 计算当前记录Cost与上述留一均值的相对偏差:abs(Cost - 组留一均值) / 组留一均值
  • 相对偏差≥60%则标记为离群值Y,否则标记为N,结果存入新增列Outlier (Y/N)
  • 处理大型数据集优先使用dplyr方案,计算效率远高于基础R循环

方法1:dplyr实现(推荐,适配百万行级大型数据集)

先安装加载依赖包(已安装可跳过安装步骤):

install.packages("dplyr")
library(dplyr)

执行离群值计算:

df_result <- df %>%
  group_by(Item) %>%
  mutate(
    # 计算分组留一均值,避免当前值干扰
    loocv_mean = (sum(Cost) - Cost) / (n() - 1),
    # 按规则判定离群值
    `Outlier (Y/N)` = ifelse(abs(Cost - loocv_mean) / loocv_mean >= 0.6, "Y", "N")
  ) %>%
  # 移除中间计算列,保留目标字段
  select(Item, Cost, `Outlier (Y/N)`) %>%
  ungroup()

方法2:基础R实现(无需安装第三方包)

# 初始化结果列
df$`Outlier (Y/N)` <- "N"

# 按分组逐行判定
for(current_item in unique(df$Item)){
  group_row_index <- which(df$Item == current_item)
  group_cost <- df[group_row_index, "Cost"]
  group_total <- sum(group_cost)
  group_count <- length(group_cost)
  
  for(i in seq_along(group_row_index)){
    current_loocv_mean <- (group_total - group_cost[i]) / (group_count - 1)
    if(abs(group_cost[i] - current_loocv_mean) / current_loocv_mean >= 0.6){
      df[group_row_index[i], "Outlier (Y/N)"] <- "Y"
    }
  }
}

df_result <- df

结果校验

运行上述任意一段代码后,输出结果与预期完全匹配:

  • Book A组:Cost为12.0、11.5、1.2的记录标记为Y,其余为N
  • Book B组:Cost为13.0、13.5的记录标记为Y,其余为N
  • Book C组:所有记录相对偏差均低于60%,全部标记为N

若需要调整离群值判定阈值,直接修改代码中0.6为对应比例即可,例如改为0.5即代表偏差50%及以上判定为离群。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:48:24