我是一个R语言初学者。在将样本放入随机森林之前,我希望进行一些异常值清理和整体缩放,使数据范围在0到1之间。
g<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10)
如果我简单地从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
因此,我的想法是用比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**)
并进行了扩展:
> 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
我需要对整个数据框应用这个公式,因此在R中实现的函数应该是这样的:
> apply(c, 2, function(x) x[x`<quantile(x, 0.95)]`<-max(x[x, ... max without the quantile(x, 0.95))
有人能帮忙吗?
顺便说一句:如果有一种直接完成此任务的函数,请告诉我。我已经尝试过 cut
和 cut2
。因为断点不唯一,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)
感谢您的帮助和关注,
Rainer
outliers
、mvoutliers
、heavy
、extremevalues
...只需前往贡献包并找到一个合适的即可。 - aL3xa