Como você converte uma coluna de quadro de dados em um tipo numérico?
fonte
Como você converte uma coluna de quadro de dados em um tipo numérico?
Como (ainda) ninguém recebeu a marca de seleção, suponho que você tenha algum problema prático em mente, principalmente porque você não especificou em que tipo de vetor deseja converter numeric
. Sugiro que você aplique a transform
função para concluir sua tarefa.
Agora estou prestes a demonstrar certa "anomalia de conversão":
# 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 em 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 vamos 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 "Onde está uma anomalia?" Bem, eu me deparei com coisas bastante peculiares em R, e isso não é a coisa mais confusa, mas pode confundir você, especialmente se você ler isso antes de rolar na cama.
Aqui vai: as duas primeiras colunas são character
. Eu deliberadamente chamado 2 nd um fake_char
. Descubra a semelhança dessa character
variável com uma que Dirk criou em sua resposta. Na verdade, é um numerical
vetor convertido em character
. 3 rd e 4 th coluna são factor
, e o último é "puramente" numeric
.
Se você utilizar a transform
função, poderá converter a variável fake_char
em numeric
, mas não a char
própria variável.
> 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
mas se você fizer o mesmo fake_char
e char_fac
tiver sorte, sairá sem NA:
> 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
Se você salvar transformado data.frame
e verificar mode
e class
, obterá:
> D <- transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
> sapply(D, mode)
char fake_char fac char_fac num
"character" "numeric" "numeric" "numeric" "numeric"
> sapply(D, class)
char fake_char fac char_fac num
"character" "numeric" "factor" "numeric" "integer"
Portanto, a conclusão é: Sim, você pode converter um character
vetor em numeric
um, mas apenas se os elementos forem "conversíveis" em numeric
. Se houver apenas um character
elemento no vetor, você receberá um erro ao tentar converter esse vetor em numerical
um.
E apenas para provar meu argumento:
> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion
> char
[1] 1 NA 3 4 NA
E agora, apenas por diversão (ou prática), tente adivinhar a saída desses comandos:
> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???
Atenciosamente Patrick Burns! =)
Algo que me ajudou: se você tiver intervalos de variáveis para converter (ou apenas mais de um), poderá usar
sapply
.Um pouco absurdo, mas apenas por exemplo:
Digamos que as colunas 3, 6 a 15 e 37 de seu dataframe precisem ser convertidas para numéricas.
fonte
sapply
chamada noas.data.frame()
lado direito, como sugerido por @Mehrad Mahmoudian abaixo, ela funcionará.se
x
é o nome da coluna do quadro de dadosdat
ex
é do tipo fator, use:fonte
as.character
fato é o que eu estava procurando. Caso contrário, a conversão às vezes dá errado. Ao menos em meu caso.Error: (list) object cannot be coerced to type 'double'
embora eu estivesse razoavelmente certo de que meu vetor não tinha caracteres / pontuações. Então eu tenteias.numeric(as.character(dat$x))
e funcionou. Agora não tenho certeza se minha coluna é de fato apenas números inteiros ou não!Eu teria adicionado um comentário (não é possível classificar baixa)
Apenas para adicionar user276042 e pangratz
Isso substituirá os valores da coluna x existente
fonte
Embora sua pergunta seja estritamente numérica, há muitas conversões difíceis de entender ao iniciar o R. Vou tentar abordar métodos para ajudar. Esta pergunta é semelhante a esta pergunta .
A conversão de tipo pode ser um problema em R porque (1) os fatores não podem ser convertidos diretamente para numéricos, eles precisam ser convertidos para a classe de caracteres primeiro, (2) as datas são um caso especial com o qual você normalmente precisa lidar separadamente e (3) fazer um loop pelas colunas do quadro de dados pode ser complicado. Felizmente, o "arrumado" resolveu a maioria dos problemas.
Esta solução usa
mutate_each()
para aplicar uma função a todas as colunas em um quadro de dados. Nesse caso, queremos aplicar atype.convert()
função, que converte seqüências de caracteres em numérico, sempre que possível. Como R ama fatores (não sei por que) as colunas de caracteres que devem permanecer são alteradas para fator. Para corrigir isso, amutate_if()
função é usada para detectar colunas que são fatores e mudar para caractere. Por fim, eu queria mostrar como o lubridato pode ser usado para alterar um carimbo de data / hora na classe de caracteres para data e hora, porque esse também é um obstáculo para iniciantes.fonte
mutate_all(type.convert, as.is=TRUE)
vez demutate_all(type.convert)
, poderá remover / evitarmutate_if(is.factor, as.character)
encurtar o comando.as.is
é um argumentotype.convert()
que indica se deve converter cadeias de caracteres como caracteres ou como fatores. Por padrão,as.is=FALSE
emtype.convert()
(ou seja, converte seqüências de caracteres em classe de fator em vez de classe de caractere).Tim está correto e Shane tem uma omissão. Aqui estão alguns exemplos adicionais:
Nosso
data.frame
agora tem um resumo da coluna fator (contagens) e resumos numéricos doas.numeric()
--- que é errado , uma vez que tem os níveis de fator numéricos --- e o resumo (correta) daas.numeric(as.character())
.fonte
Com o código a seguir, você pode converter todas as colunas do quadro de dados em numérico (X é o quadro de dados que queremos converter nas colunas):
e para converter a matriz inteira em numérica, você tem duas maneiras:
ou:
Como alternativa, você pode usar a
data.matrix
função para converter tudo em numérico, embora esteja ciente de que os fatores podem não ser convertidos corretamente, portanto, é mais seguro converter tudo emcharacter
primeiro:Eu costumo usar este último se quiser converter para matriz e numérico simultaneamente
fonte
Se você tiver problemas com:
Dê uma olhada nas suas marcas decimais. Se eles são "," em vez de "." (por exemplo, "5,3") o acima não funcionará.
Uma solução potencial é:
Eu acredito que isso é bastante comum em alguns países que não falam inglês.
fonte
Maneira universal usando
type.convert()
erapply()
:fonte
as.is = TRUE
se você deseja converter o seu personagem para numérico ou fatoresmatrix
de mudanças numéricosclasses=matrix
errados fora primeiro argumento deve ser de caráter modoPara converter uma coluna de quadro de dados em numérico, basta fazer o seguinte: -
fator para numérico: -
fonte
sapply(data_frame,function(x) as.numeric(as.character(x)))
Embora outros tenham abordado o tópico muito bem, eu gostaria de adicionar esse pensamento / sugestão rápida adicional. Você pode usar o regexp para verificar antecipadamente se os caracteres potencialmente consistem apenas em números.
Para expressões regulares mais sofisticadas e um porquê de aprender / experimentar seu poder, consulte este site realmente agradável: http://regexr.com/
fonte
Considerando que podem existir colunas char, isso se baseia em @Abdou na resposta Obter tipos de colunas da planilha do Excel automaticamente :
fonte
No meu PC (R v.3.2.3),
apply
ousapply
dê erro.lapply
funciona bem.fonte
Se o quadro de dados tiver vários tipos de colunas, alguns caracteres e alguns numéricos, tente o seguinte para converter apenas as colunas que contêm valores numéricos em numérico:
fonte
com hablar :: convert
Para converter facilmente várias colunas em diferentes tipos de dados, você pode usar
hablar::convert
. Sintaxe simples:df %>% convert(num(a))
converte a coluna a de df em numérico.Exemplo detalhado
Permite converter todas as colunas de
mtcars
para caractere.Com
hablar::convert
:resulta em:
fonte
Para converter caractere em numérico, você deve convertê-lo em fator aplicando
Você precisa criar duas colunas com os mesmos dados, porque uma coluna não pode ser convertida em numérica. Se você fizer uma conversão, ocorrerá o erro abaixo
então, depois de fazer duas colunas dos mesmos dados, aplique
ele transformará o caractere em numérico com êxito
fonte
df
é o seu quadro de dados.x
é uma coluna quedf
você deseja converterfonte
Se você não se preocupa em preservar os fatores e deseja aplicá-lo a qualquer coluna que possa ser convertida para numérica, usei o script abaixo. se df é o seu dataframe original, você pode usar o script abaixo.
Referenciei a solução de Shane e Joran entre
fonte