R语言 如何建立一个用于检测离群值的函数

djmepvbi  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(105)

我正在尝试构建一个自定义函数来检测数据集上的离群值。应该返回的输出与函数identify_outliers in rstatix()相同

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

如何纠正?

gopyfrb3

gopyfrb31#

您在自定义函数中的错误位置使用了dt。可以通过向quantile函数传递 Dataframe 来重现错误。

quantile(mtcars)

xtfrm.data.frame(x)错误:无法xtfrm Dataframe
你可以试试这个功能。

identify_outliers_custom <- function(dt, values) {
  # replace dt with values since we want to get quantile of one column
  q1 <- quantile(values)[2]
  q3 <- quantile(values)[4]
  iqr <- q3 - q1
  lower_bound <- q1 - 1.5* iqr
  upper_bound <- q3 + 1.5* iqr
  # Compare with values and not dt. Also no need for ifelse
  dt$is.outlier <- values > upper_bound | values < lower_bound
  dt$is.extreme <- values > q3 + 3 * iqr | values < q1 - 3 * iqr
  return(dt)
}

mtcars %>% identify_outliers_custom(.$mpg)

#                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb is.outlier is.extreme
#Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      FALSE      FALSE
#Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4      FALSE      FALSE
#Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1      FALSE      FALSE
#Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1      FALSE      FALSE
#Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2      FALSE      FALSE
#...
#...

相关问题