6.3 Conversão entre tipos de dados
Em algumas circunstâncias precisamos alterar o tipo de uma variável para o tipo que queremos. Para isso há o grupo de funções as.{tipo_de_dados}()
, semelhante ao grupo de funções is.{tipo_de_dados}()
. Este tipo de operação é chamada de coerção no .
Então, a coerção da variável vetor_num
para inteiro pode ser feita com:
vetor_num
#> [1] -1 0 1 2 NA
as.integer(vetor_num)
#> [1] -1 0 1 2 NA
# verificação do resultado
typeof(as.integer(vetor_num))
#> [1] "integer"
Já a sua coerção para lógico
as.logical(vetor_num)
#> [1] TRUE FALSE TRUE TRUE NA
# verificação do resultado
typeof(as.logical(vetor_num))
#> [1] "logical"
converte 0 para FALSE
e qualquer outro número para TRUE
.
A coerção da variável vetor_log
para numérica
vetor_log
#> [1] FALSE NA FALSE TRUE
as.numeric(vetor_log)
#> [1] 0 NA 0 1
# verificação do resultado
typeof(as.numeric(vetor_log))
#> [1] "double"
converte os valores FALSE
para 0 e TRUE para 1
.
A coerção da variável vetor_char
para numérica ou inteiro
vetor_char
#> [1] "ae" NA "ou"
as.integer(vetor_char)
#> Warning: NAs introduced by coercion
#> [1] NA NA NA
# verificação do resultado
typeof(as.numeric(vetor_char))
#> Warning in typeof(as.numeric(vetor_char)): NAs introduced by coercion
#> [1] "double"
gera NA
.
Como vetores atômicos podem ter dados de um único tipo, a concatenação de vetores de tipos diferentes levará a coerção automática (ou implícita) dos dados pelo , para o tipo mais fácil de ser convertido.
Misturando numeric
com character
resulta:
(vmix_num_char <- c(vetor_num, vetor_char))
#> [1] "-1" "0" "1" "2" NA "ae" NA "ou"
typeof(vmix_num_char)
#> [1] "character"
Misturando logical
com numeric
resulta:
(vmix_log_num <- c(vetor_log, vetor_num))
#> [1] 0 NA 0 1 -1 0 1 2 NA
typeof(vmix_log_num)
#> [1] "double"
Misturando double
com integer
resulta:
(vmix_dbl_int <- c(vetor_dbl, vetor_int))
#> [1] -1.51 0.33 1.46 2.04 1.00 6.00 10.00 NA
typeof(vmix_dbl_int)
#> [1] "double"
Misturando lógical
com character
resulta:
(vmix_log_char <- c(vetor_log, vetor_char))
#> [1] "FALSE" NA "FALSE" "TRUE" "ae" NA "ou"
typeof(vmix_log_char)
#> [1] "character"
A hierarquia usada na coerção entre tipos de dados segue a relação:
logical < integer < numeric < character
A coerção implícita pode ser bastante útil em operações com variáveis lógicas. Para descobrirmos quantos números são positivos na variável vetor_num
, podemos fazer:
# vetor lógico
vetor_num > 0
#> [1] FALSE FALSE TRUE TRUE NA
sum(vetor_num > 0, na.rm = TRUE)
#> [1] 2
Neste exemplo, os valores lógicos obtidos com o operador >
foram implicitamente convertidos para numéricos (TRUE
para 1
, FALSE
para 0
) antes de se obter a soma dos casos verdadeiros. O argumento na.rm = TRUE
habilita a funcionalidade de realizar a soma ignorando os itens faltantes.