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] NAEsse 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] NAEm um primeiro momento, poderíamos esperar que o resultado fosse FALSE. 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] NAEu 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] TRUERepare que essa função também é vetorizada.
is.na(c(idade_ana, idade_beto, idade_carla))
## [1] FALSE TRUE TRUEAssim 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] NaNO 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] -InfO 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