如何修正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
相关产品推荐
相关产品推荐

