- Entrada: tabela arrumada (tidy)
- cada linha é um observação ou caso
- cada coluna é uma variável
- Usaremos a biblioteca
dplyr - Operadores:
filter,arrange,select,mutate,summarise,group_by,inner_join
2 de março de 2017
dplyrfilter, arrange, select, mutate, summarise, group_by, inner_joinSeleciona linhas de acordo com critério. Original:
dados <- read.csv('data/tamanhos.txt')
dados
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Config.java | 3 | 12 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
dados %>% filter(versao == 1)
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Config.java | 3 | 12 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
dados %>% filter(versao == 1)
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Config.java | 1 | 30 |
dados %>% filter(versao == 1 | versao == 2)
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 2 | 288 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
(Use | para ou (or), & para e (and))
Ordena de acordo o valor de uma ou mais colunas. Original: dados
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Config.java | 3 | 12 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
# ordena por classe e versao dados %>% arrange(classe, versao)
| classe | versao | tamanho |
|---|---|---|
| Config.java | 1 | 30 |
| Config.java | 2 | 23 |
| Config.java | 3 | 12 |
| Tela.java | 1 | 235 |
| Tela.java | 2 | 288 |
| Tela.java | 3 | 311 |
# ordem decrescente de tamanho dados %>% arrange(desc(tamanho))
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Tela.java | 1 | 235 |
| Config.java | 1 | 30 |
| Config.java | 2 | 23 |
| Config.java | 3 | 12 |
dados %>% filter(versao == 3) %>% arrange(desc(TLOC))
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 3 | 311 |
| Config.java | 3 | 12 |
Seleciona colunas. Original:
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Config.java | 3 | 12 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
dados %>% select(classe, tamanho)
| classe | tamanho |
|---|---|
| Tela.java | 235 |
| Tela.java | 311 |
| Tela.java | 288 |
| Config.java | 12 |
| Config.java | 23 |
| Config.java | 30 |
(veja a documentação para descobrir mais opções)
dados %>% rename(linhas = tamanho)
| classe | versao | linhas |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Config.java | 3 | 12 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
Cria colunas computadas. Original:
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Config.java | 3 | 12 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
dados %>% mutate(x = tamanho / versao)
| classe | versao | tamanho | x |
|---|---|---|---|
| Tela.java | 1 | 235 | 235.0 |
| Tela.java | 3 | 311 | 103.7 |
| Tela.java | 2 | 288 | 144.0 |
| Config.java | 3 | 12 | 4.0 |
| Config.java | 2 | 23 | 11.5 |
| Config.java | 1 | 30 | 30.0 |
Combina todos os valores de uma coluna em um único valor (ex.: máximo, mínimo, soma, média…). Original:
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Config.java | 3 | 12 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
dados %>% summarise(x = max(tamanho), y = min(tamanho))
| x | y |
|---|---|
| 311 | 12 |
Agrupa os dados de acordo com o valor de uma ou mais colunas.
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Config.java | 3 | 12 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
dados %>% group_by(versao)
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Tela.java | 3 | 311 |
| Tela.java | 2 | 288 |
| Config.java | 3 | 12 |
| Config.java | 2 | 23 |
| Config.java | 1 | 30 |
dados %>% group_by(versao)
| classe | versao | tamanho |
|---|---|---|
| Tela.java | 1 | 235 |
| Config.java | 1 | 30 |
| Tela.java | 2 | 288 |
| Config.java | 2 | 23 |
| Tela.java | 3 | 311 |
| Config.java | 3 | 12 |
dados %>% group_by(versao) %>% summarise(total = sum(tamanho))
| versao | total |
|---|---|
| 1 | 265 |
| 2 | 311 |
| 3 | 323 |
A operação de inner join junta duas tabelas que se relacionam através de uma ou mais colunas. Primeiramente vamos carregar outra tabela:
versoes <- read.csv('data/versoes.txt')
| versao | ano |
|---|---|
| 1 | 2002 |
| 2 | 2002 |
| 3 | 2003 |
Note que ambas as tabelas (dados e versoes) possuem uma coluna versao. A partir dessa coluna podemos saber, por exemplo, as informações dos arquivos para cada ano.
dados %>% inner_join(versoes, by = "versao")
| classe | versao | tamanho | ano |
|---|---|---|---|
| Tela.java | 1 | 235 | 2002 |
| Tela.java | 3 | 311 | 2003 |
| Tela.java | 2 | 288 | 2002 |
| Config.java | 3 | 12 | 2003 |
| Config.java | 2 | 23 | 2002 |
| Config.java | 1 | 30 | 2002 |
versoes %>% inner_join(dados, by = "versao")
| versao | ano | classe | tamanho |
|---|---|---|---|
| 1 | 2002 | Tela.java | 235 |
| 1 | 2002 | Config.java | 30 |
| 2 | 2002 | Tela.java | 288 |
| 2 | 2002 | Config.java | 23 |
| 3 | 2003 | Tela.java | 311 |
| 3 | 2003 | Config.java | 12 |
Exemplo: qual o maior tamanho de arquivo em cada ano?
versoes %>% inner_join(dados, by = "versao") %>% group_by(ano) %>% summarise(tamMaximo = max(tamanho))
| ano | tamMaximo |
|---|---|
| 2002 | 288 |
| 2003 | 311 |
Para pesquisar:
versao e num_versao)left_join, full_join e outrasTabelas de contingência contam o número de vezes que determinadas combinações de valores de variáveis aparecem nos dados.
x <- versoes %>% inner_join(dados, by = "versao") table(x$ano, x$classe)
## ## Config.java Tela.java ## 2002 2 2 ## 2003 1 1
A função xtabs faz a mesma coisa da função table, com uma sintaxe diferente:
xtabs(~ ano + classe, data=x)
## classe ## ano Config.java Tela.java ## 2002 2 2 ## 2003 1 1
Também é possível combinar group_by e summarise para obter o mesmo efeito.