使用R删除所有列的异常值

时间:2014-12-02 17:47:34

标签: r

我使用这些功能删除异常值:

calcul.mad <- function(x) {
mad <- median(abs(x-median(x, na.rm=TRUE))) 
mad}

uper.interval <- function(x,y) {
up.inter <- median(x, na.rm=TRUE)+5*(y) 
up.inter}

lower.interval <- function(x,y) {
low.inter <- median(x, na.rm=TRUE)-5*(y)
low.inter}

functionData <- function(x,h,l) {
out <- ifelse(x > h, h, ifelse(x < l, l, x))
out}

目前,我正在单独处理数据框的每一列。是否有完整的解决方案在数据框的所有列中应用这些功能?

med_data <- median(column1, na.rm=TRUE)
cal_mad <- calcul.mad(column1)
up_data <- uper.interval(med_data, cal_mad)
low_data <- lower.interval(med_data, cal_mad)
column_without_outliers <- data.frame(functionData(column1, up_data, low_data))

示例数据框:

data_f <- data.frame(col1=rnorm(100,10,10), col2=rnorm(100,15,15), col3=rnorm(100,20,20))

3 个答案:

答案 0 :(得分:1)

您可以在数据框上使用apply

下面的代码将修剪从5x更改为2x,因为正态分布不太可能具有远离中位数的值。

data_f <- data.frame(col1=rnorm(100,10,10), col2=rnorm(100,15,15), col3=rnorm(100,20,20))

calcul.mad <- function(x) {
mad <- median(abs(x-median(x, na.rm=TRUE))) 
mad}

uper.interval <- function(x,y) {
up.inter <- median(x, na.rm=TRUE)+2*(y) 
up.inter}

lower.interval <- function(x,y) {
low.inter <- median(x, na.rm=TRUE)-2*(y)
low.inter}

functionData <- function(x,h,l) {
out <- ifelse(x > h, h, ifelse(x < l, l, x))
out}


outlier.fun <- function(column1) {
  med_data <- median(column1, na.rm=TRUE)
  cal_mad <- calcul.mad(column1)
  up_data <- uper.interval(med_data, cal_mad)
  low_data <- lower.interval(med_data, cal_mad)
  column_without_outliers <- functionData(column1, up_data, low_data)

  return(column_without_outliers)
  }

data_f_noout <- apply(data_f, 2, outlier.fun)

summary(data_f)
summary(data_f_noout)

答案 1 :(得分:1)

您可以尝试summarise_each中的dplyr并应用mediancalcul.mad。完成后,我们可以在重塑uper.interval后计算lower.intervalSum_f1。然后,一旦我们获得所有值,就应用function_Data

library(dplyr)
Sum_f1 <- summarise_each(data_f,funs(median, calcul.mad))

n <-  2*ncol(data_f)

dl <- reshape(Sum_f1, idvar='id', direction='long', sep="_", 
                      varying=split(seq(n), as.numeric(gl(n,n/2,n))))


up_data <- mapply(uper.interval, dl[,2], dl[,3])
low_data <- mapply(lower.interval, dl[,2], dl[,3])
data_f1 <- data_f
data_f1[] <- Map(functionData, data_f, up_data, low_data)

答案 2 :(得分:0)

您可以通过以下操作简化此操作

data_f <- data.frame(col1=rnorm(100,10,10), col2=rnorm(100,15,15), col3=rnorm(100,20,20))

library(tidyverse)

rmOutlier <- function(x){
                        low <- median(x, na.rm=TRUE)-5*(mad(x)) 
                       high <- median(x, na.rm=TRUE)+5*(mad(x))   
                       out <- if_else(x > high, NA,ifelse(x < low, low, x)) 
                       out }

data_f2 <- map_df(data_f, rmOutlier)

您创建的mad函数的统计信息包中提供calcul.mad函数。您可以随时使用自己的。