2.6 Vetores e operadores lógicos
Para manipular dados no R, entender vetores lógicos e operadores lógicos é fundamental.
Vetores lógicos são vetores de verdadeiros (TRUE ou apenas T, sempre em letras maiúsculas) ou falsos (FALSE ou F).
Eles podem ser convertidos em vetores numéricos e, portanto, operados matematicamente (T = 1, e F = 0).
2.6.1 Fazendo perguntas à vetores
Vetores lógicos podem ser respostas às perguntas feitas por operadores lógicos:
>- é maior que?<- é menor que?>=- é maior igual a?<=- é menor igual a?==- é igual a?!=- é diferente de?%in%- compara conteúdo de vetores
Há ainda a função duplicated() que busca valores repetidos em um vetor.
O resultado desta função é um vetor contendo TRUE ou FALSE.
Valores que possuam o valor TRUE são duplicados.
Para checar os duplicados, devemos filtrar o resultado desta ação (veja na seção 2.6.2).
# um vetor numerico
v1 <- 1:20
# quais valores de v1 são maiores ou iguais a 10
p1 <- v1 >= 10 # vai retornar um vetor lógico
p1## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
## [13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# soma dos verdadeiros responde "quantos valores de v1 são maiores ou iguais a 10, pois apenas esses valores são verdadeiros ou seja são 1)
sum(p1)## [1] 11
# experimente os demais operadores
# a regra da reciclagem também se aplica neste conceito
v1 <- 1:20
v2 <- 1:20
p2 <- v1 == v2 # compara cada par dos vetores que são idênticos
p2 # é o vetor lógico resultando, todos os valores são verdadeiros## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [16] TRUE TRUE TRUE TRUE TRUE
## [1] TRUE
## [1] TRUE
## [1] 2 2 2 3 4 5
duplicated(vv) # note que esta função retorna TRUE apenas para dois dos três valores 2 (o primeiro não é duplicado)## [1] FALSE TRUE TRUE FALSE FALSE FALSE
# comparando vetores
v1 <- c(1, 2, 3, 4)
v2 <- c(4, 4, 5, 6)
v1 %in% v2 # quantos elementos de v1 existem em v2## [1] FALSE FALSE FALSE TRUE
## [1] 1
## [1] TRUE TRUE FALSE FALSE
## [1] 2
notas.dos.alunos <- c(6.0, 5.1, 6.8, 2.8, 6.1, 9.0, 4.3, 10.4, 6.0, 7.9, 8.9, 6.8, 9.8, 4.6, 11.3, 8.0, 6.7, 4.5)
## Quantos aprovados?
sum(notas.dos.alunos >= 5)## [1] 14
## [1] 0.7777778
## [1] "78%"
Podemos usar também vetores de texto e fatores em conjunto com operadores lógicos.
# E VETORES DE TEXTO?
v1 <- rep(c("banana", "pera", "laranja", "limão"), 10)
v1 # um vetor de palavras## [1] "banana" "pera" "laranja" "limão" "banana" "pera" "laranja"
## [8] "limão" "banana" "pera" "laranja" "limão" "banana" "pera"
## [15] "laranja" "limão" "banana" "pera" "laranja" "limão" "banana"
## [22] "pera" "laranja" "limão" "banana" "pera" "laranja" "limão"
## [29] "banana" "pera" "laranja" "limão" "banana" "pera" "laranja"
## [36] "limão" "banana" "pera" "laranja" "limão"
## [1] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [13] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [25] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [37] TRUE FALSE FALSE FALSE
## [1] 10
## [1] 10
## [1] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [13] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [25] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [37] TRUE FALSE FALSE FALSE
# no caso acima == e %in% funcionam igual, mas o operador %in% é util quando quisermos comparar dois vetores de character
v2 <- c("banana", "pera", "abacate")
v1 %in% v2 # quais elementos de v1 correspondem a elementos de v2## [1] TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE
## [13] TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE
## [25] TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE
## [37] TRUE TRUE FALSE FALSE
## [1] 20
## [1] TRUE TRUE FALSE
## [1] 2
Operadores auxiliares permitem combinar perguntas:
&equivale aE- essa condição E essa outra;|equivale aOU- essa condição OU essa outra;!- inverte os valores da pergunta
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
p1 <- v1 > 5 & v1 <= 15 # quais elementos de v1 são maiores que 5 E menores ou iguais a 15
sum(p1) # quantos são?## [1] 10
p1 <- v1 > 5 | v1 <= 15 # quais elementos de v1 são maiores que 5 OU menores ou iguais a 15
sum(p1) # quantos são## [1] 20
# !exclamação NEGA ou INVERTE verdadeiros e falsos
v1 <- 1:20
sum(v1 == 5) # quantos v1 são iguais a 5?## [1] 1
## [1] 19
## [1] 15
## [1] 5
## [1] "banana" "pera" "laranja" "limão" "banana" "pera" "laranja"
## [8] "limão" "banana" "pera" "laranja" "limão" "banana" "pera"
## [15] "laranja" "limão" "banana" "pera" "laranja" "limão" "banana"
## [22] "pera" "laranja" "limão" "banana" "pera" "laranja" "limão"
## [29] "banana" "pera" "laranja" "limão" "banana" "pera" "laranja"
## [36] "limão" "banana" "pera" "laranja" "limão"
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE
## [1] 0
## [1] TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE
## [13] TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE
## [25] TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE
## [37] TRUE TRUE FALSE FALSE
## [1] 20
## [1] 20
2.6.2 Filtrando dados com vetores lógicos
Vetores lógicos podem ser usados como índices (Seção 2.5) para filtrar elementos de um vetor. É através deste conceito que podemos filtrar dados de matrizes e criar subconjunto de dados.
# um vetor com sequencia de 1 a 100
v1 <- 1:100
p1 <- v1 > 15 # Pergunta 1 quantos são maiores que 15
v1[p1] # valores que satisfazem a pergunta 1## [1] 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
## [20] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
## [39] 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
## [58] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
## [77] 92 93 94 95 96 97 98 99 100
p2 <- v1 <= 20 # Pergunta 2 quantos são menores ou iguais a 20
v1[p2] # valores que satisfazem a pergunta 2## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# quantos satisfazem as duas perguntas
p3 <- p1 & p2
v1[p2] # valores que satisfazem as duas perguntas## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
A função grep() permite a busca de uma palavra (ou pedaço dela) em um vetor de palavras.
Mais de uma palavra pode ser buscada ao mesmo tempo.
# um vetor de palavras
v1 <- rep(c("banana", "pera", "laranja", "limão"), 5)
grep("an", v1) # quais elementos tem a palavra 'an' no nome?## [1] 1 3 5 7 9 11 13 15 17 19
# note que é case.sensitive (depende se é maiusculo ou minúsculo)
grep("An", v1) # não encontra nada## integer(0)
grep("An", v1, ignore.case = T) # mas eu posso dizer para ele ignorar se é minusculo ou maiúsculo e ele encontra novamente## [1] 1 3 5 7 9 11 13 15 17 19
# quem sao esses elementos
vl <- grep("An", v1, ignore.case = T) # pega os índices desses elementos
v1[vl]## [1] "banana" "laranja" "banana" "laranja" "banana" "laranja" "banana"
## [8] "laranja" "banana" "laranja"
## [1] "banana" "laranja"
2.6.3 Perguntando por valores ausentes - NA
Vimos anteriormente como o R codifica valores ausentes (seção 1.8.4): converte em uma classe lógica definida pela palavra NA em maiúsculo.
E nossos dados frequentemente têm valores ausentes.
Isso vai gerar avisos indesejáveis e impedir certas análises.
Então, muitas vezes precisamos tirar registros com valores ausentes ou colunas com muitos valores ausentes.
Perguntar por valores ausentes no R é feito por uma função especial chamada is.na().
A resposta da função é um vetor lógico indicando quem é e quem não é NA.
Há uma outra função chamada na.omit() que elimina valores NA de um vetor.
## [1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [1] 1 2 3 4 5 6
## [1] 1 2 3 4 5 6
## attr(,"na.action")
## [1] 1 2
## attr(,"class")
## [1] "omit"
## [1] 1 2 3 4 5 6
# agora suponha o seguinte vetor
v4 <- c("NA", "NA", "pera", "banana", "mamão")
is.na(v4) # ops todos são falsos## [1] FALSE FALSE FALSE FALSE FALSE
## [1] "logical"
## [1] "character"
## [1] "NA" "NA"
## [1] NA NA "pera" "banana" "mamão"
## [1] TRUE TRUE FALSE FALSE FALSE
## [1] NA NA "pera" "banana" "mamão"
## [1] "pera" "banana" "mamão"