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

如何修正R中自定义异常值检测函数identify_outliers_custom的报错

修正自定义异常值检测函数的xtfrm.data.frame错误

我想要构建一个和rstatix包中identify_outliers函数输出一致的自定义异常值检测函数,编写的代码如下:

identify_outliers_custom <- function(dt, values) {
  q1 <- quantile(dt)[2]
  q3 <- quantile(dt)[4]
  iqr <- q3 - q1
  lower_bound <- q1 - 1.5* iqr
  upper_bound <- q3 + 1.5* iqr
  dt$is.outlier <- ifelse(dt > upper_bound | dt < lower_bound, TRUE, FALSE)
  dt$is.extreme <- ifelse(dt > q3 + 3 * iqr | dt < q1 - 3 * iqr, TRUE, FALSE)
  return(dt)
}

但将该函数应用到数据集时出现错误:

mtcars %>% identify_outliers_custom(mpg)
# Error in xtfrm.data.frame(x) : it is not possible xtfrm the data frame

请问该如何修正这个问题?


问题原因

你的函数存在两个核心问题:

  • 未使用参数values,直接对整个数据框dt执行分位数计算、数值比较,导致数据框与数值的运算触发xtfrm.data.frame错误(无法对数据框执行排序转换操作)。
  • 当前逻辑未对齐rstatix::identify_outliers的输出格式(原函数会保留原数据并添加异常值标记,或仅返回异常值行)。

修正后的函数

以下是对齐rstatix::identify_outliers行为的修正版本:

library(dplyr)

identify_outliers_custom <- function(data, variable) {
  # 提取目标变量的向量
  var_vec <- pull(data, {{ variable }})
  
  # 计算四分位数与IQR,处理缺失值
  q_vals <- quantile(var_vec, na.rm = TRUE)
  q1 <- q_vals[2]
  q3 <- q_vals[4]
  iqr <- q3 - q1
  
  # 计算异常值、极端值边界
  outlier_low <- q1 - 1.5 * iqr
  outlier_high <- q3 + 1.5 * iqr
  extreme_low <- q1 - 3 * iqr
  extreme_high <- q3 + 3 * iqr
  
  # 添加标记列并返回结果
  data %>%
    mutate(
      is.outlier = case_when(
        var_vec < outlier_low | var_vec > outlier_high ~ TRUE,
        TRUE ~ FALSE
      ),
      is.extreme = case_when(
        var_vec < extreme_low | var_vec > extreme_high ~ TRUE,
        TRUE ~ FALSE
      )
    ) %>%
    return()
}

验证使用

调用方式和你之前的写法一致,现在可以正常运行:

mtcars %>% identify_outliers_custom(mpg)

关键修正点

  • 使用dplyr::pull和tidy eval语法{{ variable }}正确提取传入的目标变量,避免直接操作整个数据框。
  • 加入na.rm = TRUE处理缺失值,对齐原函数行为。
  • 用dplyr::case_when替代ifelse,逻辑更清晰且兼容向量操作。
  • 保留原数据所有行并添加标记列,和rstatix::identify_outliers默认输出一致;若只需返回异常值行,可在mutate后添加%>% filter(is.outlier)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:52:16