2017-07-07 3 views
0

J'ai utilisé le code suivant pour essayer de remplacer la valeur des variables qui sont inférieures aux 2,5% inférieurs et supérieures aux 97,5% supérieurs avec des valeurs spécifiques.Vous pouvez exécuter ce code. Il fournit un fichier de données ouvert.Remplacement d'une erreur de code aberrante de 2,5%, 97,5% dans R

credit<-read.csv("http://freakonometrics.free.fr/german_credit.csv", header=TRUE) 
fun <- function(x){ 
    quantiles <- quantile(x, c(.025, .975)) 
    x[ x < quantiles[1] ] <- quantiles[1] 
    x[ x > quantiles[2] ] <- quantiles[2] 
    x 
} 
fun(credit) 

Mais le message d'erreur est apparu.

Error in `[.data.frame`(x, order(x, na.last = na.last, decreasing = decreasing)) : 
    undefined columns selected 

Quel est le problème? Je suis heureux de toute aide!

+ Ajout commentaire

Je trouve que la fonction ci-dessus ne fonctionne pas dans le cadre de données, mais ne fonctionne que dans le vecteur.

Je peux changer la valeur aberrante de chaque variable dans le fichier de données avec le code suivant:

Cependant, mon fichier de données a tellement de variables qu'il est gênant d'entrer le code un par un.

Alors, comment puis-je modifier les valeurs aberrantes des variables qu'une valeur spécifique ne pmax & pmin?

+0

Le problème est que vous n'avez sélectionné aucune colonne, comme l'indique l'erreur. 'x' est l'ensemble de la trame de données. –

+0

@Rich Scriven Merci pour la réponse. Mais je ne comprends pas ce que tu veux dire. Pouvez-vous l'expliquer dans le code? –

+0

'quantile (x, c (.025, .975))' est la ligne de problème. Essayez-le avec 'quantile (crédit, c (.025, .975))'. Dans quelle colonne essayez-vous d'exécuter 'quantile'? Il ne fonctionne que sur des vecteurs numériques, pas sur des trames de données entières. –

Répondre

0

Il n'y a rien de mal dans votre fonction aussi longtemps que vous l'appliquez à une colonne. Je voudrais utiliser mutate_at ou mutate_all (si vous voulez vraiment l'appliquer à toutes les colonnes) du paquet dplyr. Quelque chose comme ceci:

library(dplyr) 
credit_trunc <- credit %>% 
    mutate_at(vars(Credit.Amount, Creditability), funs(fun)) 

ou

credit_trunc <- credit %>% 
    mutate_all(funs(fun)) 

ou si vous avez également des colonnes d'un autre type (par exemple le facteur, le caractère) dans votre trame de données, vous pouvez utiliser:

credit_trunc <- credit %>% 
    mutate_if(is.numeric, funs(fun)) 

Cela vous donnera le cadre de données avec les colonnes/toutes les colonnes/toutes les colonnes numériques choisies comme vous l'avez voulu.

+0

Avez-vous vérifié votre code? Si j'utilise votre code, j'ai une erreur comme celle-ci "Erreur dans mutate_impl (.data, dots): les facteurs ne sont pas autorisés" Devrais-je utiliser uniquement la valeur continue? –

+0

ouais je viens de courir à nouveau. mh .. as-tu fait quelque chose avec les données entre le lire avec read.csv et appliquer la fonction? – friep

+0

oh !!! Je suis désolé .. Mon code complet a également traité les données sous la forme de facteurs. Cependant, je pense qu'une valeur aberrante ne peut pas exister pour une variable de type facteur. Est-ce correct? –