我使用这些功能删除异常值:
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))
答案 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
并应用median
和calcul.mad
。完成后,我们可以在重塑uper.interval
后计算lower.interval
和Sum_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
函数。您可以随时使用自己的。