Je suis un R-novice. Je souhaite effectuer un nettoyage des valeurs aberrantes et une mise à l'échelle globale de 0 à 1 avant de placer l'échantillon dans une forêt aléatoire.R: nettoyage des valeurs aberrantes pour chaque colonne dans une base de données en utilisant des quantiles 0,05 et 0,95
g<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10)
Si je fais une mise à l'échelle simple, 0 à 1 le résultat serait:
> 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
Donc, mon idée est de remplacer les valeurs de chaque colonne sont supérieures à la 0,95-quantile avec le valeur suivante plus petite que le 0,95-quantile - et la même chose pour le quantile 0,05.
Ainsi, le résultat avant l'échelle serait:
g<-c(**70**,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,**40**)
et mis à l'échelle:
> 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
J'ai besoin de cette formule pour un dataframe ensemble, de sorte que la mise en œuvre fonctionnelle au sein de R doit être quelque chose comme:
> apply(c, 2, function(x) x[x`<quantile(x, 0.95)]`<-max(x[x, ... max without the quantile(x, 0.95))
Quelqu'un peut-il aider?
Parlée à côté: s'il existe une fonction qui effectue ce travail directement, s'il vous plaît faites le moi savoir. J'ai déjà vérifié cut
et cut2
. cut
échoue en raison de ruptures non uniques; cut2
fonctionnerait, mais ne donne que de retour des valeurs de chaîne ou la valeur moyenne, et je besoin d'un vecteur numérique de 0 - 1.
pour le procès:
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)
Cordialement et merci pour l'aide,
Rainer
Il existe plusieurs paquets sur CRAN qui peuvent répondre à vos besoins: 'outliers',' mvoutliers', 'heavy',' extremevalues' ... il suffit de se diriger vers les paquets contribués et de trouver celui qui convient. – aL3xa
Merci pour ce conseil, je vais jeter un oeil à ces forfaits! Cordialement, Rainer – Rainer