Konvertieren von Zeichen in numerische Zeichen ohne NA-Zwang in R

Ich arbeite in R und habe einen Datenrahmen, dd_2006, mit numerischen Vektoren. Als ich die Daten zum ersten Mal importierte, musste ich aus drei meiner Variablen $, Dezimalpunkte und einige Leerzeichen entfernen: SumOfCost, SumOfCases und SumOfUnits. Um das zu tun, habe ich verwendetstr_replace_all. Allerdings habe ich einmal benutztstr_replace_allwurden die Vektoren in Zeichen umgewandelt. Also habe ich as.numeric (var) verwendet, um die Vektoren in numerische zu konvertieren, aber NAs wurden eingeführt, obwohl die Vektoren keine NAs enthielten, als ich den folgenden Code ausführte, BEVOR ich den as.numeric-Code ausführte.

sum(is.na(dd_2006$SumOfCost))
[1] 0
sum(is.na(dd_2006$SumOfCases))
[1] 0
sum(is.na(dd_2006$SumOfUnits))
[1] 0

Hier ist mein Code nach dem Import, beginnend mit dem Entfernen des $ aus dem Vektor. In demstr(dd_2006) Bei der Ausgabe habe ich einige der Variablen aus Platzgründen gelöschtstr_replace_all Der unten stehende Code stimmt nicht mit der Ausgabe überein, die ich hier gepostet habe (aber im Originalcode):

library("stringr")
dd_2006$SumOfCost <- str_sub(dd_2006$SumOfCost, 2, ) #2=the first # after the $

#Removes decimal pt, zero's after, and commas
dd_2006[ ,9] <- str_replace_all(dd_2006[ ,9], ".00", "")
dd_2006[,9] <- str_replace_all(dd_2006[,9], ",", "")

dd_2006[ ,10] <- str_replace_all(dd_2006[ ,10], ".00", "")
dd_2006[ ,10] <- str_replace_all(dd_2006[,10], ",", "")

dd_2006[ ,11] <- str_replace_all(dd_2006[ ,11], ".00", "")
dd_2006[,11] <- str_replace_all(dd_2006[,11], ",", "")

str(dd_2006)
'data.frame':   12604 obs. of  14 variables:
 $ CMHSP                     : Factor w/ 46 levels "Allegan","AuSable Valley",..: 1 1 1
 $ FY                        : Factor w/ 1 level "2006": 1 1 1 1 1 1 1 1 1 1 ...
 $ Population                : Factor w/ 1 level "DD": 1 1 1 1 1 1 1 1 1 1 ...
 $ SumOfCases                : chr  "0" "1" "0" "0" ...
 $ SumOfUnits                : chr  "0" "365" "0" "0" ...
 $ SumOfCost                 : chr  "0" "96416" "0" "0" ...

Ich fand eine Antwort auf eine ähnliche Frage wie ichHierunter Verwendung des folgenden Codes:

# create dummy data.frame
d <- data.frame(char = letters[1:5], 
                fake_char = as.character(1:5), 
                fac = factor(1:5), 
                char_fac = factor(letters[1:5]), 
                num = 1:5, stringsAsFactors = FALSE)

Werfen wir einen Blick auf data.frame

> d
  char fake_char fac char_fac num
1    a         1   1        a   1
2    b         2   2        b   2
3    c         3   3        c   3
4    d         4   4        d   4
5    e         5   5        e   5

und lass uns rennen:

> sapply(d, mode)
       char   fake_char         fac    char_fac         num 
"character" "character"   "numeric"   "numeric"   "numeric" 
> sapply(d, class)
       char   fake_char         fac    char_fac         num 
"character" "character"    "factor"    "factor"   "integer" 

Jetzt fragst du dich wahrscheinlich: "Wo ist eine Anomalie?" Nun, ich bin in R auf ziemlich merkwürdige Dinge gestoßen, und dies ist nicht die verwirrendste Sache, aber es kann Sie verwirren, besonders wenn Sie dies lesen, bevor Sie sich ins Bett rollen.

Hier geht's: Die ersten beiden Spalten sind Zeichen. Ich habe absichtlich 2. fake_char genannt. Erkennen Sie die Ähnlichkeit dieser Zeichenvariablen mit einer, die Dirk in seiner Antwort erstellt hat. Es ist eigentlich ein numerischer Vektor, der in Zeichen umgewandelt wird. Die dritte und vierte Spalte sind Faktoren, und die letzte Spalte ist "rein" numerisch.

Wenn Sie die Transformationsfunktion verwenden, können Sie fake_char in numerische Werte konvertieren, nicht jedoch die char-Variable.

> transform(d, char = as.numeric(char))
  char fake_char fac char_fac num
1   NA         1   1        a   1
2   NA         2   2        b   2
3   NA         3   3        c   3
4   NA         4   4        d   4
5   NA         5   5        e   5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
but if you do same thing on fake_char and char_fac, you'll be lucky, and get away with no NA's:

transform (d, fake_char = as.numeric (fake_char), char_fac = as.numeric (char_fac))

  char fake_char fac char_fac num
1    a         1   1        1   1
2    b         2   2        2   2
3    c         3   3        3   3
4    d         4   4        4   4
5    e         5   5        5   5

Also habe ich den obigen Code in meinem Skript ausprobiert, aber trotzdem NAs gefunden (ohne eine Warnmeldung über Zwang).

#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

Habe ich auch benutzttable(dd_2006$SumOfCases) usw., um die Beobachtungen zu betrachten, um festzustellen, ob es Zeichen gibt, die ich in den Beobachtungen verpasst habe, aber keine. Irgendwelche Gedanken darüber, warum die NAs auftauchen und wie man sie loswird?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage