在R中去除异常值

3

我查看了一组数据,并决定去除异常值,其中异常值的定义为距离平均值2个标准差(SD)。

如果我有一组数据,比如500行,有15个不同的属性,如何去除所有具有一个或多个属性与平均值相差2个标准差或更远的行?

是否有一种使用R轻松完成此任务的方法? 谢谢。


2
如果你在 StackOverflow 上搜索 [R] remove outlier,你会得到许多相关的先前问题,例如:https://dev59.com/TXM_5IYBdhLWcg3wSBAU 或 https://dev59.com/im445IYBdhLWcg3wl7XW。 - Andrie
2个回答

3

可能有很多方法和可能的附加包来处理这个问题。我建议您首先尝试以下方法:

library(sos); findFn("outlier")

这里有一种使用scale函数标准化向量的方法,可以实现您所要求的功能。
#create a data set with outliers
set.seed(10)
dat <- data.frame(sapply(seq_len(5), function(i) 
    sample(c(1:50, 100:101), 200, replace=TRUE)))

#standardize each column (we use it in the outdet function)
scale(dat)

#create function that looks for values > +/- 2 sd from mean
outdet <- function(x) abs(scale(x)) >= 2
#index with the function to remove those values
dat[!apply(sapply(dat, outdet), 1, any), ]

回答你的问题,是的,有一种简单的方法,可以将代码简化成一行:

dat[!apply(sapply(dat, function(x) abs(scale(x)) >= 2), 1, any), ]

我猜想可能有一个软件包可以做到这一点并且更多。对于查找所需功能,sos软件包非常出色(依我之见)。


2
na.rm = TRUE, ...) {
qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
H <- 1.5 * IQR(x, na.rm = na.rm)
y <- x
y[x < (qnt[1] - H)] <- NA
y[x > (qnt[2] + H)] <- NA
y
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接