在数据帧中使用列中位数来估算列异常值

时间:2015-10-15 14:28:52

标签: r

这是否有一个已知的功能..? 我想将此应用于我的数值数据框中的某些列,以便将异常值替换为列中位数。

1 个答案:

答案 0 :(得分:1)

看看这个例子。一种方法是:

假设您使用interquartile range来识别异常值,您可以执行此操作:

示例数据:

#the first 3 rows are outliers here in both columns
set.seed(100)
mydf <- data.frame(a = c(1000,1000,1000,runif(10)), b= c(1000,1000,1000,runif(10)))

我使用以下函数实质上转换每列的异常值(异常值是小于25%四分位数的任何点减去IQR的1.5倍 OR 超过75%四分位数加上进入中位数的IQR的1.5倍:

outlier <- function(x) {
 x[x < quantile(x,0.25) - 1.5 * IQR(x) | x > quantile(x,0.75) + 1.5 * IQR(x)] <- median(x)
 x
}

输出(使用lapply应用于每列):

> mydf[] <- lapply(mydf, outlier)
> mydf
            a         b
1  0.48377074 0.6690217
2  0.48377074 0.6690217
3  0.48377074 0.6690217
4  0.30776611 0.6249965
5  0.25767250 0.8821655
6  0.55232243 0.2803538
7  0.05638315 0.3984879
8  0.46854928 0.7625511
9  0.48377074 0.6690217
10 0.81240262 0.2046122
11 0.37032054 0.3575249
12 0.54655860 0.3594751
13 0.17026205 0.6902905

正如您所看到的那样,异常值(原始data.frame中的值为1000,即两列中的前三行)已被中位数替换。