R:使用分位数0.05和0.95清除数据框中每列的异常值

Rai*_*ner 3 scaling r function outliers dataframe

我是R新手.在将样本放入随机森林之前,我想做一些异常值清理和从0到1的过度扩展.

g<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10)
Run Code Online (Sandbox Code Playgroud)

如果我从0 - 1进行简单的缩放,结果将是:

> round((g - min(g))/abs(max(g) - min(g)),1)

 [1] 1.0 0.1 0.0 0.1 0.0 0.0 0.0 0.1 0.1 0.1 0.0 0.1 0.0 0.1 0.0 0.1 0.0
Run Code Online (Sandbox Code Playgroud)

所以我的想法是将每列大于0.95分位数的值替换为小于0.95分位数的下一个值 - 对于0.05分位数则相同.

所以预先缩放的结果将是:

g<-c(**70**,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,**40**)
Run Code Online (Sandbox Code Playgroud)

和缩放:

> round((g - min(g))/abs(max(g) - min(g)),1)

 [1] 1.0 0.7 0.3 0.7 0.3 0.0 0.3 0.7 1.0 0.7 0.0 1.0 0.3 0.7 0.3 1.0 0.0
Run Code Online (Sandbox Code Playgroud)

我需要这个公式用于整个数据帧,因此R中的功能实现应该是这样的:

> apply(c, 2, function(x) x[x`<quantile(x, 0.95)]`<-max(x[x, ... max without the quantile(x, 0.95))
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

旁边说:如果有直接完成这项工作的功能,请告诉我.我已签出cutcut2.cut由于没有独特的休息而失败; cut2会工作,但只返回字符串值或平均值,我需要一个0 - 1的数字向量.

审判:

a<-c(100,6,5,6,5,4,5,6,7,6,4,7,5,6,5,7,1)

b<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10)

c<-cbind(a,b)

c<-as.data.frame(c)
Run Code Online (Sandbox Code Playgroud)

关心并感谢您的帮助,

莱纳

had*_*ley 10

请不要这样做.这不是处理异常值的好策略 - 特别是因为10%的数据不太可能是异常值!