删除带R的所有列的异常值
我使用这些函数来删除异常值:删除带R的所有列的异常值,r,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
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}
calcul.mad您可以在数据帧上使用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)
数据\u f您可以尝试从dplyr
中对每个数据进行汇总,并应用中值
和calcul.mad
。一旦我们得到它,我们就可以在重塑Sum\u f1
之后计算uper.interval
和lower.interval
。然后,在获得所有值后应用函数\u 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)
库(dplyr)
Sum_f1您可以使用以下方法简化此过程
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)
data\u f检查plyr包中的“colwise”功能;这可能会满足您的需要。您可以使用apply
,而不必在使用lappy
时强制返回到data.frame
。两者都同样快:apply(data\u f,2,outlier.fun)
出于好奇,我做了一些基准测试,比较了公认的dplyr
方法和这个基本R方法。有趣的是,dplyr
方法只快了7-10%。@treysp我只在第一行使用了dplyr
。其他代码只是calcul.mad(Id)中的base R
错误:找不到函数“calcul.mad”
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)
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)