3.8 Valores especiais

Vimos anteriormente que se você tentar acessar uma posição que não existe dentro de um vetor, ele retorna um valor estranho.

vetor <- c(1, 2, 3)

vetor[4]
## [1] NA

Esse valor, o NA, é tratado de forma especial no R. Ele representa a ausência de informação, isto é, a informação existe, mas nós (e o R) não sabemos qual é.

O NA para o R nada mais é do que o valor faltante ou omisso da Estatística. O famoso missing. Geralmente, quando temos uma base com valores faltando, como a idade para alguns indivíduos da nossa amostra, não significa que a idade deles não existe. Significa apenas que não temos essa informação.

Esse conceito é muito importante para entender o resultado da expressão abaixo.

5 == NA
## [1] NA

Em um primeiro momento, poderíamos esperar que o resultado fosse TRUE. Mas, sabendo o significado por trás do NA — um valor desconhecido —, a verdadeira pergunta que estamos fazendo é: 5 é igual a um valor que existe, mas que não sei qual é? É como se eu perguntasse se eu tenho 5 moedas na mão, mas lhe mostrasse a mão fechada. A resposta para isso é não sei ou, dentro do R, NA.

Um outro exemplo:

idade_ana <- 30
idade_beto <- NA
idade_carla <- NA

idade_ana == idade_beto
## [1] NA

idade_beto == idade_carla
## [1] NA

Eu posso saber a idade da Ana, mas se eu não souber a idade do Beto, não sei se os dois tem a mesma idade. Por isso, NA. Da mesma forma, se não sei nem a idade do Beto nem da Carla, também não tenho como saber se os dois têm a mesma idade. Outra vez NA.

Mas e quando queremos saber se um valor é NA ou não? Para fazer esse teste, temos que rodar is.na(valor-ou-objeto).

is.na(NA)
## [1] TRUE

is.na(idade_ana)
## [1] FALSE

is.na(idade_beto)
## [1] TRUE

Repare que essa função também é vetorizada.

is.na(c(idade_ana, idade_beto, idade_carla))
## [1] FALSE  TRUE  TRUE

Assim como o NA, existem outros valores especiais muito comuns no R.

O NaN (not a number) representa indefinições matemáticas.

0/0
## [1] NaN

log(-1)
## Warning in log(-1): NaNs produced
## [1] NaN

O Inf (infinito) representa um número muito grande (que o computador não consegue representar) ou um limite matemático.

# O computador não consegue representar um número tão grande.
# O número é então """arredondado""" para infinito.
10^310
## [1] Inf

# Limite matemático.
1 / 0
## [1] Inf

# O "menos infinito" também existe.
-1 / 0
## [1] -Inf

O NULL (nulo) representa a ausência de um objeto. Ele não tem significado prático para a análise dados. Está mais em sintonia com comportamentos de lógica de programação. Muitas vezes vamos definir um objeto como nulo para dizer ao R que não queremos dar um valor para ele. Muito utilizado em funções.

Da mesma forma que utilizados is.na() para testar se um objeto é NA, utilizamos is.nan(), is.infinite() ou is.null() para testar se um objeto é NaN, infinito ou nulo.

nao_sou_um_numero <- NaN
objeto_infinito <- Inf
objeto_nulo <- NULL

is.nan(nao_sou_um_numero)
## [1] TRUE

is.infinite(objeto_infinito)
## [1] TRUE

is.null(objeto_nulo)
## [1] TRUE

Exercícios

1. Quais as diferenças entre NaN, NULL, NA e Inf? Digite expressões que retornem cada um desses valores.

2. Escreva um código que conte o número de NAs do vetor b.

b <- c(1, 0, NA, NA, NA, NA, 7, NA, NA, NA, NA, NA, 2, NA, NA, 10, 1, 1, NA)

Curso-R