删除R中的异常值

时间:2012-05-13 00:03:56

标签: r statistics standard-deviation

我查看了一组数据并决定删除异常值是好的,异常值的定义是偏离平均值2SD。

如果我有一组数据,比如500行,包含15个不同的属性,如何删除所有具有1个或多个属性的行,这些属性与平均值相差2个标准差?

使用R有一种简单的方法吗? 谢谢,

2 个答案:

答案 0 :(得分: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), ]

因此,在回答您的问题时,有一种简单的方法可以将执行此操作的代码简化为1行代码:

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

而且我猜测有一个包可以做到这一点以及更多。 sos包很棒(恕我直言),可以找到你想要的功能。

答案 1 :(得分: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
}