Convertendo Caracteres em Numérico sem NA Coerção em R
Estou trabalhando em R e tenho um dataframe, dd_2006, com vetores numéricos. Quando importei os dados pela primeira vez, precisei remover $ 's, pontos decimais e alguns espaços em branco de 3 das minhas variáveis: SumOfCost, SumOfCases e SumOfUnits. Para fazer isso, eu useistr_replace_all
. No entanto, uma vez que eu useistr_replace_all
, os vetores foram convertidos em caracteres. Então eu usei as.numérico (var) para converter os vetores em numéricos, mas NAs foram introduzidos, mesmo quando eu corri o código abaixo ANTES de rodar o código as.numeric, não havia NAs nos vetores.
sum(is.na(dd_2006$SumOfCost))
[1] 0
sum(is.na(dd_2006$SumOfCases))
[1] 0
sum(is.na(dd_2006$SumOfUnits))
[1] 0
Aqui está o meu código depois da importação, começando com a remoção do $ do vetor. Nostr(dd_2006)
saída, eu deletei algumas das variáveis para o bem do espaço, então os #s da coluna nostr_replace_all
O código abaixo não corresponde à saída que eu postei aqui (mas eles fazem no código original):
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" ...
Eu encontrei uma resposta para uma pergunta semelhante à minhaAqui, usando o seguinte código:
# 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)
Vamos dar uma olhada no 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
e deixe-nos correr:
> 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"
Agora você provavelmente se pergunta "cadê uma anomalia?" Bem, eu esbarrei em coisas bastante peculiares em R, e isso não é a coisa mais confusa, mas pode confundir você, especialmente se você ler isso antes de ir para a cama.
Aqui vai: as duas primeiras colunas são caractere. Eu chamei deliberadamente o segundo fake_char. Descubra a similaridade dessa variável de personagem com uma que Dirk criou em sua resposta. Na verdade, é um vetor numérico convertido em personagem. 3ª e 4ª coluna são fator, e a última é "puramente" numérica.
Se você utilizar a função transform, poderá converter o fake_char em numérico, mas não a própria variável char.
> 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:
transformar (d, fake_char = como.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
Então eu tentei o código acima no meu script, mas ainda apareci com NAs (sem uma mensagem de aviso sobre coerção).
#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
Eu também useitable(dd_2006$SumOfCases)
etc. olhar para as observações para ver se há algum caractere que eu perdi nas observações, mas não havia nenhum. Quaisquer pensamentos sobre por que os NAs estão surgindo e como se livrar deles?