Sto lavorando in R e ho un dataframe, dd_2006, con vettori numerici. Quando ho importato i dati per la prima volta, dovevo rimuovere $, i punti decimali e alcuni spazi vuoti da 3 delle mie variabili: SumOfCost, SumOfCases e SumOfUnits. Per fare ciò, ho usato str_replace_all
. Tuttavia, una volta utilizzato str_replace_all
, i vettori sono stati convertiti in caratteri. Quindi ho usato as.numeric (var) per convertire i vettori in numerico, ma sono stati introdotti gli AN, anche se quando ho eseguito il codice qui sotto PRIMA ho eseguito il codice as.numeric, non c'erano NA nei vettori.Conversione di caratteri in numerici senza NA Coercizione in R
sum(is.na(dd_2006$SumOfCost))
[1] 0
sum(is.na(dd_2006$SumOfCases))
[1] 0
sum(is.na(dd_2006$SumOfUnits))
[1] 0
Ecco il mio codice da dopo l'importazione, che inizia con la rimozione del $ dal vettore. Nell'output str(dd_2006)
, ho eliminato alcune variabili per motivi di spazio, quindi la colonna #s nel codice str_replace_all
riportato di seguito non corrisponde all'output che ho postato qui (ma lo fanno nel codice originale):
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" ...
ho trovato una risposta a una domanda simile alla mia here, utilizzando il seguente codice:
# 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)
Diamo uno sguardo alla 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
corriamo:
> 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"
Ora è probabilmente chiedi "Dove è un'anomalia?" Beh, mi sono imbattuto in cose piuttosto strane in R, e questa non è la cosa più confusa, ma può confondervi, specialmente se leggete questo prima di andare a letto.
Ecco le prime due colonne: carattere. Ho deliberatamente chiamato il secondo uno fake_char. Trova la somiglianza di questa variabile di carattere con quella che Dirk ha creato nella sua risposta. In realtà è un vettore numerico convertito in carattere. La 3a e la 4a colonna sono fattori, e l'ultimo è "puramente" numerico.
Se si utilizza la funzione di trasformazione, è possibile convertire il file fake_char in numerico, ma non la variabile char stessa.
> 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:
Trasforma (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
così ho provato il codice di cui sopra nel mio script , ma è ancora arrivato con NA (senza un messaggio di avvertimento sulla coercizione).
#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
Ho anche usato table(dd_2006$SumOfCases)
ecc a guardare le osservazioni per vedere se ci sono dei personaggi che ho perso nelle osservazioni, ma non ce n'erano. Qualche idea sul perché gli AN stanno spuntando e su come liberarsene?
Siamo spiacenti, ma qual è la domanda? La risposta collegata sembra riassumere tutto abbastanza bene, e senza un esempio riproducibile del problema * tu * stai effettivamente affrontando, non sono sicuro di come gli altri possano aiutare .... – A5C1D2H2I1M1N2O1R2T1
Immagino che questi dati provengano da Excel o un altro foglio di calcolo. La prossima volta, cancella tutta la formattazione prima di esportarla. –