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.