这是否有一个已知的功能..? 我想将此应用于我的数值数据框中的某些列,以便将异常值替换为列中位数。
答案 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,即两列中的前三行)已被中位数替换。