Filtro em vetores

Os operadores lógicos podem ser utilizados para filtrar vetores e data frames. Para entender de maneira simples como eles funcionam, vamos criar um vetor de números e testar quais deles são maiores que 10:

> vetor = c(1, 5, 10, 15, 25, 50)
> vetor > 10
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE

Quando utilizamos a expressão vetor > 10, o R faz um teste lógico com cada elemento do vetor e checa se o número é maior que 10. Quando verdadeiro, ele retorna TRUE e quando falso ele retorna FALSE. É possível utilizar esse conjunto de TRUE/FALSE para realizar filtros no próprio vetor, quando colocado essa expressão entre colchetes. Veja o exemplo:

> vetor[vetor > 10]
[1] 15 25 50

O código acima, portanto, filtra o vetor apresentado de acordo com o teste lógico aplicado dentre dos colchetes.

Entendendo mais as comparações

Existem vários tipos de comparações que podemos fazer. No exemplo acima vimos a desigualdade maior que, no entanto, temos os seguintes tipos de comparações:

> 1 == 1 # 1 é igual a 1
[1] TRUE

> 1 != 1 # 1 é diferente de 1
[1] FALSE

> 1 > 1 # 1 é maior que 1
[1] FALSE

> 1 < 1 # 1 é menor que 1
[1] FALSE

> 1 >= 1 # 1 é maior ou igual a 1
[1] TRUE

> 1 <= 1 # 1 é menor ou igual a 1
[1] TRUE

Aplicando filtros em data frames

Todas essas comparações podem ser aplicadas para filtrar linhas de data frames também. Vamos construir um data-frame com os dados abaixo:

> nomes = c("João", "Maria", "Daniel", "Aline", "Mariana")
> salario = c(1000, 2500, 2000, 3000, 3500)
> df = data.frame(nomes, salario)
> df
    nomes salario
1    João    1000
2   Maria    2500
3  Daniel    2000
4   Aline    3000
5 Mariana    3500

Na tabela acima que temos um conjunto de dados com nomes e salários, se quisermos filtrar para mostrar apenas as pessoas com salário igual ou maior a 3000, fazemos da seguinte forma:

> df[df$salario >= 3000,] # Não esquecer da vírgula no final
    nomes salario
4   Aline    3000
5 Mariana    3500

Portanto, colocamos a comparação lógica dentro dos colchetes como primeiro argumento, indicando um filtro para linhas. Para não dar erro, precisamos colocar uma vírgula no final e deixamos o segundo argumento vazio, para que o R entenda que queremos filtrar apenas as linhas.

De forma semelhante, se quisermos filtrar o salário por nome da pessoa, podemos fazer o seguinte para mostrar os dados de João:

> df[df$nome == "João",] # Não se esqueça dos dois sinais de igual
  nomes salario
1  João    1000

Operadores lógicos AND e OR

Em uma situação onde você pode ter múltiplos criterios para fazer um filtro, por exemplo, valor de salário entre 2500 e 3000 (incluindo esses valores), você pode utilizar um operador lógico &. O & funciona como um concatenador E para duas operações e ele só retorna TRUE se ambas as condições forem verdadeiras. Veja o exemplo:

> df[df$salario >= 2500 & df$salario <= 3000,]
  nomes salario
2 Maria    2500
4 Aline    3000

Existe também o operador lógico | que funciona como concatenador OU para duas operações. Isso significa que basta uma das comparações ser verdadeira que o retorno será TRUE. No exemplo abaixo vamos filtrar as linhas cujos nomes são João OU Aline:

> df[df$nome == "João" | df$nome == "Aline",]
  nomes salario
1  João    1000
4 Aline    3000

Para praticar

Uma forma de praticar os operadores lógicos é utilizar as bases de dados disponíveis por padrão no R. A base mtcars possui informações sobre modelos de carro publicados pela revista Motor Trends nos Estados Unidos. Para carregar os dados, utilize os comandos abaixo:

> data(mtcars)
> str(mtcars) # Entenda a estrutura desse data frame
'data.frame':	32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

Note a quantidade grande de colunas que há nesse arquivo. Se você souber um pouco de inglês, pode utilizar a função help() para obter um descritivo desse conjunto de dados:

help(mtcars)

E para praticar, você pode realizar os seguintes filtros:

  1. Retornar todos os carros que possuem 6 ou mais cilindros (cyl).
  2. Retornar todos os carros que possuem câmbio manual (am).
  3. Retornar todos os carros que consomem menos do que 20 miles/gallon (mpg) e que pesem menos do que 3k pounds (wt).

E assim por diante, as possibilidades são bem numerosas!

No próximo artigo veremos como trabalhar com arquivos CSV e do Excel, como importar, exportar e verificar a qualidade dos dados.