2 de março de 2017

Transformação de dados

  • 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

Transformação: filter

Seleciona 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

Transformação: filter

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

Transformação: filter

dados %>% filter(versao == 1)
classe versao tamanho
Tela.java 1 235
Config.java 1 30

Transformação: filter

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))

Transformação: arrange

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

Transformação: arrange

# 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

Transformação: arrange

# 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

Combinando transformações

dados %>%
  filter(versao == 3) %>%
  arrange(desc(TLOC))
classe versao tamanho
Tela.java 3 311
Config.java 3 12

Transformação: select

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

Transformação: select

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)

Transformação: rename

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

Transformação: mutate

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

Transformação: mutate

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

Transformação: summarise

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

Transformação: summarise

dados %>% summarise(x = max(tamanho), y = min(tamanho))
x y
311 12

Transformação: group_by

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

Transformação: group_by

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

Transformação: group_by

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

Transformação: group_by + summarise

dados %>%
  group_by(versao) %>%
  summarise(total = sum(tamanho))
versao total
1 265
2 311
3 323

Transformação: inner_join

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

Transformação: inner_join

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.

Transformação: inner_join

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

Transformação: inner_join

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

Transformação: inner_join

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

Transformação: inner_join

Para pesquisar:

  • Como fazer a junção de duas tabelas se as colunas possuem nomes diferentes (ex.: versao e num_versao)
  • Veja funções relacionadas: left_join, full_join e outras

Transformação: table

Tabelas 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

Transformação: table

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.

Para saber mais