6
votes

R - du facteur à une erreur numérique ou entière

J'ai un fichier de données dans r code> que j'ai chargé à partir d'un fichier CSV. L'une des variables s'appelle "montant" et est censée contenir des nombres positifs et négatifs.

Lorsque j'ai examiné le Dataframe, ce type de données de cette variable est répertorié comme un facteur et j'en ai besoin dans un format numérique (pas sûr de quel type si - entier - entier - numérique, umm ...?). J'ai donc essayé de le convertir à l'un de ces deux formats, mais j'ai vu un comportement intéressant. P>

Dataframe initial: P>

df2 <- data.frame(df$Amount, as.numeric(df$Amount), as.integer(df$Amount))

str(df2)
'data.frame':   2620276 obs. of  3 variables:
 $ df.Amount            : Factor w/ 11837 levels "","-1","-10",..: 2 2 1664 4 6290 6290 6290 6290 6290 6290 ...
 $ as.numeric.df.Amount.: num  2 2 1664 4 6290 ...
 $ as.integer.df.Amount.: int  2 2 1664 4 6290 6290 6290 6290 6290 6290 ...

> head(df2, 20)
         df.Amount        as.numeric.df.Amount.       as.integer.df.Amount.
1               -1                           2                           2
2               -1                           2                           2
3             -201                        1664                        1664
4             -100                           4                           4
5                1                        6290                        6290
6                1                        6290                        6290
7                1                        6290                        6290
8                1                        6290                        6290
9                1                        6290                        6290
10               1                        6290                        6290
11               1                        6290                        6290
12               1                        6290                        6290
13               1                        6290                        6290
14               1                        6290                        6290
15               1                        6290                        6290
16               1                        6290                        6290
17               1                        6290                        6290
18               2                        7520                        7520
19               2                        7520                        7520
20               2                        7520                        7520

r

0 commentaires

4 Réponses :


11
votes

La racine du problème est probablement une valeur funky dans votre CSV importé. S'il venait d'Excel, ce n'est pas rare. Il peut s'agir d'un symbole pour cent, d'un personnage "commentaire" d'Excel ou de toute une longue liste de choses. Je regarderais le CSV dans votre éditeur de votre choix et voyez ce que vous pouvez voir.

Mis à part cela, vous avez quelques options.

read.csv prend un argument facultatif StringsasFactors que vous pouvez définir sur FALSE

Un facteur est stocké en tant que niveaux entier qui correspondent aux valeurs. Lorsque vous convertissez directement avec as.numérique , vous enfermez avec ces niveaux d'entiers plutôt que les valeurs initiales: xxx

Sinon, regardez ? facteur :

en particulier, comme.numérique appliqué à un facteur n'a pas de sens, et peut se produire par une coercition implicite. Transformer un facteur f à approximativement sa valeurs numériques originales, as.numérique (niveaux (f)) [f] est recommandé et légèrement plus efficace que as.numeric (as.character (f)) .

Cependant, je soupçonne que ce sera une erreur parce que l'entrée a quelque chose en outre un nombre.


2 commentaires

Une fois que la colonne en question est un caractère plutôt que sur facteur, j'ai pu trouver la source de ce type de problème assez rapidement en utilisant grep ou GREPL pour vérifier certains des suspects probables.


+1 bonne réponse. J'ai élargi un peu dans ma réponse sur la façon de trouver les valeurs incriminées ...



11
votes

@justin est correct. Voici une promenade sur la façon de trouver les valeurs incriminées: xxx pré>

Notez que si votre jeu de données a des valeurs manquantes codées comme une autre cellule vide ou la chaîne "na", vous avez Pour spécifier cela à lire.Table: P>

# Here "N/A" is used instead of "NA"...
read.table(text="A B\n1 2\n3 N/A\n", header=TRUE, na.strings="N/A")


0 commentaires

1
votes

Je suis nouveau ici mais j'ai utilisé ce forum pour mes questions. J'avais un problème similaire mais le ci-dessous a travaillé pour moi. Je dépose des données de fichiers TXT au cadre de données xxx

notez que j'ai utilisé aussi.is sur la colonne 6 qui disposait de données numériques ainsi que des ordures dans certaines lignes. Utiliser AS.IS Ports Les données sous forme de caractères de la colonne 6. Ensuite, les caractères suivants ont modifié les caractères de la colonne 6 en valeurs numériques. Toutes les valeurs des ordures ont été converties en Na qui pourraient être retirées plus tard. xxx

espère que cela aide


0 commentaires

1
votes

Il suffit de convertir les valeurs de facteur en premier, puis convertissez-la en numérique. Cela devrait résoudre votre problème.

as.numeric(as.character(df$Amount))


0 commentaires