减少异常值的功能

时间:2019-06-20 00:56:08

标签: r function outliers

我正在与支持向量机一起使用,并希望减少异常值。 因此,我具有将异常值降低至原始值的70%的功能。 我发现此方法比winsorization更好,因为它不会为相同的值分配大量数据点,而是会产生更均匀的分布。

减少异常值的功能-

outlier <- function(x) {
  x[x < quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE) | x > quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE)] <- (x * 0.7)
  x
}

问题是该函数在某些列上有效,但在其他列上却产生此错误消息。

警告消息:

  

在x [x <分位数(x,0.25,na.rm = TRUE)-3 * IQR(x,na.rm = TRUE)|   :要替换的项目数不是替换长度的倍数

2 个答案:

答案 0 :(得分:2)

由于函数内<-的LHS和RHS上向量的长度不同,导致出现错误。这是正确的方法-

outlier <- function(x) {
  idx <- (x < quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE)) | (x > quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE))
  x[idx] <- x[idx] * 0.7
  x
}

答案 1 :(得分:1)

要解决长度问题,请使用ifelse,以便您知道将创建一个与原始x相同长度的新向量。另外,在复杂的条件下,请尝试将它们分解成较小的部分。除非您对操作顺序有100%的把握,否则很容易出错,而且我不确定您当前的逻辑是否满足您的要求:

outlier <- function(x) {
    lower_limit = quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE)
    upper_limit = quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE)
    is_outlier = (x < lower_limit) | (x > upper_limit)
    print(paste("Replacing", sum(is_outlier), "outliers"))
    ifelse(
        is_outlier,
        x * 0.7,
        x
    )
}