用 NA 替换异常值

Replace outliers with NA

我找到了这个函数,我想调整它以用 NA 替换异常值而不是删除观察值。

我试图在这一行中添加 <-NA data <- data[!outliers(data[[col]]),],但我无法让它工作。你能帮我改编一下吗?

在这里您可以找到带有一些模拟数据的代码。如果您需要其他东西,请告诉我。

在此先感谢您。

cov.matone <- matrix(c(1, .0,
                       .0, 1), nrow = 2)

data <- data.frame(MASS::mvrnorm(n = 1e4, 
                                  mu = c(4, 4), 
                                  Sigma = cov.matone))

outliers <- function(x) {
  
  Q1 <- quantile(x, probs=.25, na.rm=T)
  Q3 <- quantile(x, probs=.75, na.rm=T)
  iqr = Q3-Q1
  
  upper_limit = Q3 + (iqr*1.5)
  lower_limit = Q1 - (iqr*1.5)
  
  x > upper_limit | x < lower_limit
}

remove_outliers <- function(data, cols = names(data)) {
  for (col in cols) {
    data <- data[!outliers(data[[col]]),]
  }
  data
}

data_nooutliers <- remove_outliers(data, c('X1', 'X2' ))

不是将循环结果分配给输入数据,而是使用 is.na<-NA 值分配给函数 outliers.

给出的元素
remove_outliers <- function(data, cols = names(data)) {
  for (col in cols) {
    is.na(data[[col]]) <- outliers(data[[col]])
  }
  data
}

备注

以下函数与函数 outliers 完全相同,但更简单。

outliers2 <- function(x) x %in% boxplot.stats(x)$out

s1 <- lapply(names(data), \(x) outliers(data[[x]]))
s2 <- lapply(names(data), \(x) outliers2(data[[x]]))
identical(s1, s2)
#[1] TRUE