3.7 Testes lógicos
Poder fazer qualquer tipo de operação lógica é um dos motivos pelos quais programar nos deixar mais eficientes. Dê bastante atenção a elas, pois usaremos comparações lógicas o tempo todo!
Uma operação lógica nada mais é do que um teste que retorna verdadeiro ou falso. No R (e em outras linguagens de programação), esses dois valores recebem uma classe especial: logical.
O verdadeiro no R vai ser representado pelo valor TRUE e o falso pelo valor FALSE. Esses nomes no R são reservados, isto é, você não pode chamar nenhum objeto de TRUE ou FALSE.
TRUE <- 1
## Error in TRUE <- 1 : invalid (do_set) left-hand side to assignmentChecando a classe desses valores, vemos que são lógicos7. Eles são os únicos possíveis valores dessa classe.
class(TRUE)
## [1] "logical"
class(FALSE)
## [1] "logical"Agora que conhecemos o TRUE e FALSE, podemos explorar os teste lógicos. Começando pelo mais simples: vamos testar se um valor é igual ao outro. Para isso, usamos o operador ==.
# Testes com resultado verdadeiro
1 == 1
## [1] TRUE
"a" == "a"
## [1] TRUE
# Testes com resultado falso
1 == 2
## [1] FALSE
"a" == "b"
## [1] FALSETambém podemos testar se dois valores são diferentes. Para isso, usamos o operador !=.
# Testes com resultado falso
1 != 1
## [1] FALSE
"a" != "a"
## [1] FALSE
# Testes com resultado verdadeiro
1 != 2
## [1] TRUE
"a" != "b"
## [1] TRUEPara comparar se um valor é maior que outro, temos à disposição 4 operadores:
# Maior
3 > 3
## [1] FALSE
3 > 2
## [1] TRUE
# Maior ou igual
3 >= 4
## [1] FALSE
3 >= 3
## [1] TRUE
# Menor
3 < 3
## [1] FALSE
3 < 4
## [1] TRUE
# Menor ou igual
3 <= 2
## [1] FALSE
3 <= 3
## [1] TRUEUm outro operador muito útil é o %in%. Com ele, podemos verificar se um valor está dentro de um conjunto de valores (vetor).
3 %in% c(1, 2, 3)
## [1] TRUE
"a" %in% c("b", "c")
## [1] FALSENós começamos essa seção dizendo que usaremos testes lógicos o tempo todo. O motivo para isso é que eles fazem parte de uma operação muito comum na manipulação de bases de dados: os filtros.
No Excel, por exemplo, quando você filtra uma planilha, o que está sendo feito por trás é um teste lógico.
Falamos anteriormente que cada coluna das nossas bases de dados será representada dentro do R como um vetor. O comportamento que explica a importância dos testes lógicos na hora de filtrar uma base está ilustrado abaixo:
minha_coluna <- c(1, 3, 0, 10, -1, 5, 20)
minha_coluna > 3
## [1] FALSE FALSE FALSE TRUE FALSE TRUE TRUE
minha_coluna[minha_coluna > 3]
## [1] 10 5 20Muitas coisas aconteceram aqui, vamos por partes.
Primeiro, na operação minha_coluna > 3 o R fez um excelente uso do comportamento de reciclagem. No fundo, o que ele fez foi transformar (reciclar) o valor 3 no vetor c(3, 3, 3, 3, 3, 3, 3) e testar se c(1, 3, 0, 10, -1, 5, 20) > c(3, 3, 3, 3, 3, 3, 3).
Como os operadores lógicos também são vetorizados (fazem operações elemento a elemento), os testes realizados foram 1 > 3, 3 > 3, 0 > 3, 10 > 3, -1 > 3, 5 > 3 e, finalmente, 20 > 3. Cada um desses testes tem o seu próprio resultado. Por isso a saída de minha_coluna > 3 é um vetor de verdadeiros e falsos, respectivos a cada um desses 7 testes.
A segunda operação traz a grande novidade aqui: podemos usar os valores TRUE e FALSE para selecionar elementos de um vetor!
A regra é muito simples: retornar as posições que receberem TRUE, não retornar as posições que receberem FALSE. Portanto, a segunda operação é equivalente a:
minha_coluna[c(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE)]
## [1] 10 5 20O vetor lógico filtra o vetor minha_coluna, retornando apenas os valores maiores que 3, já que foi esse o teste lógico que fizemos.
Essa é a mágica que acontece por trás de filtros no R. Na prática, não precisaremos usar colchetes, não lembraremos da reciclagem e nem veremos a cara dos TRUE e FALSE. Mas conhecer esse processo é muito importante, principalmente para encontrar problemas de código ou de base.
Para finalizar, listamos na tabela abaixo os principais operadores lógicos.
| Operador | Descrição |
|---|---|
| x < y | x menor que y? |
| x <= y | x menor ou igual a y? |
| x > y | x maior que y? |
| x >= y | x maior ou igual a y? |
| x == y | x igual a y? |
| x != y | x diferente de y? |
| !x | Negativa de x |
| x | y | x ou y são verdadeiros? |
| x & y | x e y são verdadeiros? |
| x %in% y | x pertence a y? |
| xor(x, y) | x ou y são verdadeiros (apenas um deles)? |
Por fim, veja algumas diferenças entre comparações lógicas no SQL e no R:
- Igualdade: no SQL é só um sinal de igual:
2 = 1. No R são dois:2 == 1. - Diferença: no SQL, usamos
<>. No R usamos!=. - Negação: em vez de usar a palavra
NOTigual ao SQL, usamos!no R. Por exemplo,id not in ('1', '2', '3')fica!(id %in% c(1, 2, 3)).
Exercícios
1 O código abaixo vai guardar no objeto segredo um número inteiro entre 0 e 10. Sem olhar qual número foi guardado no objeto, resolva os itens a seguir:
segredo <- round(runif(1, min = 0, max = 10))a. Teste se o segredo é maior ou igual a 0.
b. Teste se o segredo é menor ou igual a 10.
c. Teste se o segredo é maior que 5.
d. Teste se o segredo é par.
e. Teste se
segredo * 5é maior que a sua idade.f. Desafio. Escreva um teste para descobrir o valor do segredo.
2. Escreva um código em R que devolva apenas os valores maiores ou iguais a 10 do vetor abaixo:
vetor <- c(4, 8, 15, 16, 23, 42)3. Use o vetor numeros abaixo para responder as questões seguintes.
numeros <- -4:2a. Escreva um código que devolva apenas valores positivos do vetor
numeros.b. Escreva um código que devolta apenas os valores pares do vetor
numeros.c. Filtre o vetor para que retorne apenas aqueles valores que, quando elevados a 2, são menores do que 4.
Também conhecidos como valores binários ou booleanos↩︎