9
votes

Conversion du caractère en numérique sans la contrainte NA dans R

Je travaille dans R et avoir un Dataframe, DD_2006, avec des vecteurs numériques. Lorsque j'ai d'abord importé les données, je devais retirer les dollars, les points décimaux et les espaces vides de 3 de mes variables: Sumofcost, Sumofcases et Sumofunits. Pour ce faire, j'ai utilisé str_replace_all code>. Cependant, une fois que j'ai utilisé str_replace_all code>, les vecteurs ont été convertis en caractères. Donc, j'ai utilisé aussi.numérique (var) pour convertir les vecteurs en numériques, mais les NAS ont été introduites, même si lorsque j'ai couru le code ci-dessous avant que je fasse le code AS.numérique, il n'y avait pas de NAS dans les vecteurs.

#changing sumofcases, cost, and units to numeric
dd_2006_1 <- transform(dd_2006, SumOfCases = as.numeric(SumOfCases), SumOfUnits = as.numeric(SumOfUnits), SumOfCost = as.numeric(SumOfCost))

> sum(is.na(dd_2006_1$SumOfCost))
[1] 12
> sum(is.na(dd_2006_1$SumOfCases))
[1] 7
> sum(is.na(dd_2006_1$SumOfUnits))
[1] 11


2 commentaires

Désolé, mais quelle est la question? La réponse liée semble résumer tout ce qui est assez bien et sans exemple reproductible du problème vous est en fait confronté, je ne sais pas comment les autres peuvent aider ....


Je suppose que ces données sont venues d'Excel ou d'une autre feuille de calcul. La prochaine fois, effacez toutes les formatage avant d'exporter.


3 Réponses :


13
votes

Comme Anando a souligné, le problème est quelque part dans vos données et nous ne pouvons pas vraiment vous aider beaucoup sans exemple reproductible. Cela dit, voici un extrait de code pour vous aider à annuler les enregistrements de vos données qui vous causent des problèmes: xxx pré>

au lieu de deviner pourquoi les NAS sont introduites, sortez les enregistrements qui Causez le problème et adressez-les directement / individuellement jusqu'à ce que les NAS disparaissent. P>

mise à jour: on dirait que le problème est dans votre appel à str_replace_all code>. Je ne connais pas la bibliothèque stringr code>, mais je pense que vous pouvez accomplir la même chose avec gsub code> comme ceci: p> xxx pré> Je ne suis pas tout à fait sûr de ce que cela accomplit cependant: p>

sum(as.numeric(v2)!=as.numeric(gsub("\\.00", "", v2))) # Illustrate that vectors are equivalent.

[1] 0


2 commentaires

Lorsque j'exécute ce code pour Sumofunits, je reçois > qui (ix.na) #row index du problème NAS [1] 1098 2297 4728 5559 5592 5702 6955 8191 10517 10881 10955> Test [ix.na] # [1 ] «" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " 100.00 100.00 100.00 300.00 400.00 200.00 200.00 600.00 100.00 Comment est-ce un problème avec les données à la place quelque chose qui se passe lorsque j'exécute le code str_replace_all ?


On dirait que vous avez épinglé le problème. Je ne sais pas vraiment ce que le prétraitement de ces chaînes accomplissons depuis que vous pouvez jeter ces valeurs à des chiffres, mais sans les décimales, mais il illustre une solution alternative utilisant gsub dans ma réponse mise à jour.



4
votes

Si vous souhaitez convertir le caractère en un nombre également numérique, puis le convertissez d'abord en un facteur (utilisant AS.Factor) et enregistrez / écrasez la variable existante. Suivant Convertir cette variable de facteur en numérique (en utilisant as.numeric). Vous ne créeriez pas NAS de cette façon et sera en mesure de convertir le jeu de données que vous avez dans numérique.


1 commentaires

AS.numérique (AS.Factor (DF $ x)) remplace simplement les valeurs avec 1 et 2, indices



0
votes

Une solution simple consiste à laisser retay deviner de nouveaux types de données pour chaque colonne xxx


0 commentaires