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.
<- c(1, 2, 3)
vetor
4]
vetor[## [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 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:
<- 30
idade_ana <- NA
idade_beto <- NA
idade_carla
== idade_beto
idade_ana ## [1] NA
== idade_carla
idade_beto ## [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.
<- NaN
nao_sou_um_numero <- Inf
objeto_infinito <- NULL
objeto_nulo
is.nan(nao_sou_um_numero)
## [1] TRUE
is.infinite(objeto_infinito)
## [1] TRUE
is.null(objeto_nulo)
## [1] TRUE