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

如何将Boxplot$out返回的异常值整理为包含所属类别的表格

解决提取箱线图异常值并关联对应类别的问题

我明白你想要把箱线图识别出的异常值和它们对应的车辆类别(比如van、bus)关联起来,整理成清晰的表格。之前用which()只拿到索引却不知道怎么对应类别确实有点麻烦,下面我给你两种可靠的解决方案:

方法一:利用boxplot()返回的结果直接匹配

boxplot()函数返回的对象里不仅有异常值$out,还有$group(标记每个异常值属于哪个变量)和$names(变量名称),我们可以利用这些信息快速关联到类别:

# 先获取箱线图的完整结果
bp_result <- boxplot(vehData)

# 初始化存储异常值的数据框
outliers_table <- data.frame(
  变量名 = bp_result$names[bp_result$group],
  异常值 = bp_result$out,
  车辆类别 = NA,
  stringsAsFactors = FALSE
)

# 遍历每个异常值,匹配对应的类别
for (i in 1:nrow(outliers_table)) {
  # 获取当前异常值对应的变量和数值
  target_var <- outliers_table$变量名[i]
  target_val <- outliers_table$异常值[i]
  # 找到该变量中等于异常值的行索引
  row_index <- which(vehData[[target_var]] == target_val)
  # 赋值对应的类别
  outliers_table$车辆类别[i] <- vehData$Class[row_index]
}

# 查看最终表格
print(outliers_table)

方法二:基于IQR规则精准识别异常值(推荐)

方法一在遇到变量中有重复数值时可能会误判(比如同一数值既有异常值也有非异常值),这种情况下更推荐直接用箱线图的IQR规则来识别异常值,再关联类别:

# 定义函数:提取单个变量的异常值及对应类别
extract_outliers <- function(data, var_name) {
  var_data <- data[[var_name]]
  # 计算IQR上下边界
  q1 <- quantile(var_data, 0.25, na.rm = TRUE)
  q3 <- quantile(var_data, 0.75, na.rm = TRUE)
  iqr_range <- q3 - q1
  lower_limit <- q1 - 1.5 * iqr_range
  upper_limit <- q3 + 1.5 * iqr_range
  
  # 找到异常值的行索引
  outlier_rows <- which(var_data < lower_limit | var_data > upper_limit)
  
  # 返回结果数据框
  data.frame(
    变量名 = var_name,
    异常值 = var_data[outlier_rows],
    车辆类别 = data$Class[outlier_rows],
    stringsAsFactors = FALSE
  )
}

# 遍历所有数值变量(排除Class列)
numeric_columns <- setdiff(names(vehData), "Class")
all_outliers <- do.call(rbind, lapply(numeric_columns, function(col) extract_outliers(vehData, col)))

# 查看结果
print(all_outliers)

补充说明:关于你之前的removeOutliers函数

你的removeOutliers函数里用x[!x %in% OutVals]存在风险:如果某个变量里有和异常值相同的非异常值,这些值也会被误删。如果需要删除异常值,推荐用方法二中的IQR规则来筛选行,比如:

# 删除所有包含异常值的行(或者按变量删除)
remove_outliers_from_data <- function(data) {
  numeric_cols <- setdiff(names(data), "Class")
  keep_rows <- rep(TRUE, nrow(data))
  
  for (col in numeric_cols) {
    var_data <- data[[col]]
    q1 <- quantile(var_data, 0.25, na.rm = TRUE)
    q3 <- quantile(var_data, 0.75, na.rm = TRUE)
    iqr_range <- q3 - q1
    lower_limit <- q1 - 1.5 * iqr_range
    upper_limit <- q3 + 1.5 * iqr_range
    
    # 标记需要保留的行(非异常值)
    keep_rows <- keep_rows & (var_data >= lower_limit & var_data <= upper_limit)
  }
  
  return(data[keep_rows, ])
}

# 使用示例
cleaned_vehData <- remove_outliers_from_data(vehData)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:57:31