Manipulação de dados com data.table
#-----------------------------------------------------------------------
# Tutorial básico de data.table.
library(data.table)
# Curiosidade:
# https://stackoverflow.com/questions/24715894/faster-way-to-read-fixed-width-files-in-r
#-----------------------------------------------------------------------
# Carregando um conjunto de dados do repositório de ML.
# browseURL("http://archive.ics.uci.edu/ml/datasets/Bank+Marketing")
# Download do arquivo.
u <- "http://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip"
download.file(u, destfile = basename(u))
# Descompactação.
dir()
## [1] "00-datatable-ggplot2_cache"
## [2] "00-datatable-ggplot2.Rmd"
## [3] "01-cross-validation.html"
## [4] "01-cross-validation.Rmd"
## [5] "02-gradient-methods.html"
## [6] "02-gradient-methods.Rmd"
## [7] "03-regularization.html"
## [8] "03-regularization.Rmd"
## [9] "04-regression-trees.html"
## [10] "04-regression-trees.Rmd"
## [11] "05-support-vector-machine.html"
## [12] "05-support-vector-machine.Rmd"
## [13] "06-k-nearest-neighborhood.html"
## [14] "06-k-nearest-neighborhood.Rmd"
## [15] "07-naive-bayes.html"
## [16] "07-naive-bayes.Rmd"
## [17] "08-logistic-regression.html"
## [18] "08-logistic-regression.Rmd"
## [19] "09-linear-discriminant-analysis.html"
## [20] "09-linear-discriminant-analysis.Rmd"
## [21] "10-clustering.html"
## [22] "10-clustering.Rmd"
## [23] "bank.zip"
## [24] "_output.yaml"
utils::unzip(zipfile = basename(u))
# Número de linhas e topo da tabela usando funções do Shell.
system("wc -l bank-full.csv")
system("head -n 3 bank-full.csv")
# Carregando o arquivo com utils::read.table().
system.time(da <- read.table(file = "bank-full.csv",
header = TRUE,
sep = ";",
stringsAsFactors = FALSE))
## user system elapsed
## 0.340 0.000 0.342
## 'data.frame': 45211 obs. of 17 variables:
## $ age : int 58 44 33 47 33 35 28 42 58 43 ...
## $ job : chr "management" "technician" "entrepreneur" "blue-collar" ...
## $ marital : chr "married" "single" "married" "married" ...
## $ education: chr "tertiary" "secondary" "secondary" "unknown" ...
## $ default : chr "no" "no" "no" "no" ...
## $ balance : int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ housing : chr "yes" "yes" "yes" "yes" ...
## $ loan : chr "no" "no" "yes" "no" ...
## $ contact : chr "unknown" "unknown" "unknown" "unknown" ...
## $ day : int 5 5 5 5 5 5 5 5 5 5 ...
## $ month : chr "may" "may" "may" "may" ...
## $ duration : int 261 151 76 92 198 139 217 380 50 55 ...
## $ campaign : int 1 1 1 1 1 1 1 1 1 1 ...
## $ pdays : int -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
## $ previous : int 0 0 0 0 0 0 0 0 0 0 ...
## $ poutcome : chr "unknown" "unknown" "unknown" "unknown" ...
## $ y : chr "no" "no" "no" "no" ...
# Lendo com a data.table::fread().
system.time(db <- fread(input = "bank-full.csv",
header = TRUE,
sep = ";"))
## user system elapsed
## 0.028 0.000 0.027
## Classes 'data.table' and 'data.frame': 45211 obs. of 17 variables:
## $ age : int 58 44 33 47 33 35 28 42 58 43 ...
## $ job : chr "management" "technician" "entrepreneur" "blue-collar" ...
## $ marital : chr "married" "single" "married" "married" ...
## $ education: chr "tertiary" "secondary" "secondary" "unknown" ...
## $ default : chr "no" "no" "no" "no" ...
## $ balance : int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ housing : chr "yes" "yes" "yes" "yes" ...
## $ loan : chr "no" "no" "yes" "no" ...
## $ contact : chr "unknown" "unknown" "unknown" "unknown" ...
## $ day : int 5 5 5 5 5 5 5 5 5 5 ...
## $ month : chr "may" "may" "may" "may" ...
## $ duration : int 261 151 76 92 198 139 217 380 50 55 ...
## $ campaign : int 1 1 1 1 1 1 1 1 1 1 ...
## $ pdays : int -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
## $ previous : int 0 0 0 0 0 0 0 0 0 0 ...
## $ poutcome : chr "unknown" "unknown" "unknown" "unknown" ...
## $ y : chr "no" "no" "no" "no" ...
## - attr(*, ".internal.selfref")=<externalptr>
#-----------------------------------------------------------------------
# Usando os operadores da estrutura DT[i, j, by].
# DT[i, j, by]
# | | |
# | | +--> Faz operações por estratos.
# | +--> Transforma variáveis (cria, muda, combina, resume e remove).
# +--> Aplica filtros nas linhas.
# Filtrando os dados.
db[age > 50, ]
## age job marital education default balance housing loan
## 1: 58 management married tertiary no 2143 yes no
## 2: 58 retired married primary no 121 yes no
## 3: 53 technician married secondary no 6 yes no
## 4: 58 technician married unknown no 71 yes no
## 5: 57 services married secondary no 162 yes no
## ---
## 9251: 73 retired married secondary no 2850 no no
## 9252: 51 technician married tertiary no 825 no no
## 9253: 71 retired divorced primary no 1729 no no
## 9254: 72 retired married secondary no 5715 no no
## 9255: 57 blue-collar married secondary no 668 no no
## contact day month duration campaign pdays previous poutcome y
## 1: unknown 5 may 261 1 -1 0 unknown no
## 2: unknown 5 may 50 1 -1 0 unknown no
## 3: unknown 5 may 517 1 -1 0 unknown no
## 4: unknown 5 may 71 1 -1 0 unknown no
## 5: unknown 5 may 174 1 -1 0 unknown no
## ---
## 9251: cellular 17 nov 300 1 40 8 failure yes
## 9252: cellular 17 nov 977 3 -1 0 unknown yes
## 9253: cellular 17 nov 456 2 -1 0 unknown yes
## 9254: cellular 17 nov 1127 5 184 3 success yes
## 9255: telephone 17 nov 508 4 -1 0 unknown no
db[age > 50 & y == "no", ]
## age job marital education default balance housing loan
## 1: 58 management married tertiary no 2143 yes no
## 2: 58 retired married primary no 121 yes no
## 3: 53 technician married secondary no 6 yes no
## 4: 58 technician married unknown no 71 yes no
## 5: 57 services married secondary no 162 yes no
## ---
## 7938: 70 retired married primary no 324 no no
## 7939: 63 retired married secondary no 1495 no no
## 7940: 59 unknown married unknown no 1500 no no
## 7941: 59 management married tertiary no 138 yes yes
## 7942: 57 blue-collar married secondary no 668 no no
## contact day month duration campaign pdays previous poutcome y
## 1: unknown 5 may 261 1 -1 0 unknown no
## 2: unknown 5 may 50 1 -1 0 unknown no
## 3: unknown 5 may 517 1 -1 0 unknown no
## 4: unknown 5 may 71 1 -1 0 unknown no
## 5: unknown 5 may 174 1 -1 0 unknown no
## ---
## 7938: cellular 15 nov 78 1 96 7 success no
## 7939: cellular 16 nov 138 1 22 5 success no
## 7940: cellular 16 nov 280 1 104 2 failure no
## 7941: cellular 16 nov 162 2 187 5 failure no
## 7942: telephone 17 nov 508 4 -1 0 unknown no
# O total de registros.
db[age > 50, .N]
## [1] 9255
db[age > 50 & y == "no", .N]
## [1] 7942
# A média para balanço.
db[age > 50, mean(balance)]
## [1] 1858.465
db[age > 50 & y == "no", mean(balance)]
## [1] 1773.603
# Duas medidas resumo.
db[, list(m = mean(balance), s = sd(duration))]
## m s
## 1: 1362.272 257.5278
# Tabela de frequência por categoria.
db[, .N, by = education]
## education N
## 1: tertiary 13301
## 2: secondary 23202
## 3: unknown 1857
## 4: primary 6851
# Tabela de frequência por categoria.
db[, .N, by = list(education, y)]
## education y N
## 1: tertiary no 11305
## 2: secondary no 20752
## 3: unknown no 1605
## 4: primary no 6260
## 5: secondary yes 2450
## 6: tertiary yes 1996
## 7: unknown yes 252
## 8: primary yes 591
db[, .N, by = .(education, y)]
## education y N
## 1: tertiary no 11305
## 2: secondary no 20752
## 3: unknown no 1605
## 4: primary no 6260
## 5: secondary yes 2450
## 6: tertiary yes 1996
## 7: unknown yes 252
## 8: primary yes 591
# Medidas resumo por estrato.
db[, mean(balance), by = y]
## y V1
## 1: no 1303.715
## 2: yes 1804.268
db[, mean(balance), by = education]
## education V1
## 1: tertiary 1758.416
## 2: secondary 1154.881
## 3: unknown 1526.754
## 4: primary 1250.950
db[, mean(balance), by = job]
## job V1
## 1: management 1763.6168
## 2: technician 1252.6321
## 3: entrepreneur 1521.4701
## 4: blue-collar 1078.8267
## 5: unknown 1772.3576
## 6: retired 1984.2151
## 7: admin. 1135.8389
## 8: services 997.0881
## 9: self-employed 1647.9709
## 10: unemployed 1521.7460
## 11: housemaid 1392.3952
## 12: student 1388.0608
# Converter para fator.
db[, education := factor(education)]
str(db)
## Classes 'data.table' and 'data.frame': 45211 obs. of 17 variables:
## $ age : int 58 44 33 47 33 35 28 42 58 43 ...
## $ job : chr "management" "technician" "entrepreneur" "blue-collar" ...
## $ marital : chr "married" "single" "married" "married" ...
## $ education: Factor w/ 4 levels "primary","secondary",..: 3 2 2 4 4 3 3 3 1 2 ...
## $ default : chr "no" "no" "no" "no" ...
## $ balance : int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ housing : chr "yes" "yes" "yes" "yes" ...
## $ loan : chr "no" "no" "yes" "no" ...
## $ contact : chr "unknown" "unknown" "unknown" "unknown" ...
## $ day : int 5 5 5 5 5 5 5 5 5 5 ...
## $ month : chr "may" "may" "may" "may" ...
## $ duration : int 261 151 76 92 198 139 217 380 50 55 ...
## $ campaign : int 1 1 1 1 1 1 1 1 1 1 ...
## $ pdays : int -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
## $ previous : int 0 0 0 0 0 0 0 0 0 0 ...
## $ poutcome : chr "unknown" "unknown" "unknown" "unknown" ...
## $ y : chr "no" "no" "no" "no" ...
## - attr(*, ".internal.selfref")=<externalptr>
## [1] "primary" "secondary" "tertiary" "unknown"
db[, marital := factor(marital)]
str(db)
## Classes 'data.table' and 'data.frame': 45211 obs. of 17 variables:
## $ age : int 58 44 33 47 33 35 28 42 58 43 ...
## $ job : chr "management" "technician" "entrepreneur" "blue-collar" ...
## $ marital : Factor w/ 3 levels "divorced","married",..: 2 3 2 2 3 2 3 1 2 3 ...
## $ education: Factor w/ 4 levels "primary","secondary",..: 3 2 2 4 4 3 3 3 1 2 ...
## $ default : chr "no" "no" "no" "no" ...
## $ balance : int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ housing : chr "yes" "yes" "yes" "yes" ...
## $ loan : chr "no" "no" "yes" "no" ...
## $ contact : chr "unknown" "unknown" "unknown" "unknown" ...
## $ day : int 5 5 5 5 5 5 5 5 5 5 ...
## $ month : chr "may" "may" "may" "may" ...
## $ duration : int 261 151 76 92 198 139 217 380 50 55 ...
## $ campaign : int 1 1 1 1 1 1 1 1 1 1 ...
## $ pdays : int -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
## $ previous : int 0 0 0 0 0 0 0 0 0 0 ...
## $ poutcome : chr "unknown" "unknown" "unknown" "unknown" ...
## $ y : chr "no" "no" "no" "no" ...
## - attr(*, ".internal.selfref")=<externalptr>
## [1] "divorced" "married" "single"
# Padronizar uma variável para o intervalo unitário.
db[, ageu := (age - min(age))/diff(range(age))]
str(db)
## Classes 'data.table' and 'data.frame': 45211 obs. of 18 variables:
## $ age : int 58 44 33 47 33 35 28 42 58 43 ...
## $ job : chr "management" "technician" "entrepreneur" "blue-collar" ...
## $ marital : Factor w/ 3 levels "divorced","married",..: 2 3 2 2 3 2 3 1 2 3 ...
## $ education: Factor w/ 4 levels "primary","secondary",..: 3 2 2 4 4 3 3 3 1 2 ...
## $ default : chr "no" "no" "no" "no" ...
## $ balance : int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ housing : chr "yes" "yes" "yes" "yes" ...
## $ loan : chr "no" "no" "yes" "no" ...
## $ contact : chr "unknown" "unknown" "unknown" "unknown" ...
## $ day : int 5 5 5 5 5 5 5 5 5 5 ...
## $ month : chr "may" "may" "may" "may" ...
## $ duration : int 261 151 76 92 198 139 217 380 50 55 ...
## $ campaign : int 1 1 1 1 1 1 1 1 1 1 ...
## $ pdays : int -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
## $ previous : int 0 0 0 0 0 0 0 0 0 0 ...
## $ poutcome : chr "unknown" "unknown" "unknown" "unknown" ...
## $ y : chr "no" "no" "no" "no" ...
## $ ageu : num 0.519 0.338 0.195 0.377 0.195 ...
## - attr(*, ".internal.selfref")=<externalptr>
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.1948 0.2727 0.2979 0.3896 1.0000
# Ordenar a tabela.
db <- db[order(job, marital, age)]
db[, c("job", "marital", "age")]
## job marital age
## 1: admin. divorced 26
## 2: admin. divorced 26
## 3: admin. divorced 26
## 4: admin. divorced 27
## 5: admin. divorced 27
## ---
## 45207: unknown single 51
## 45208: unknown single 57
## 45209: unknown single 58
## 45210: unknown single 59
## 45211: unknown single 61
Trabalhando com dados do IPEADATA
#-----------------------------------------------------------------------
# Manipulação de dados com classe `data.table`.
#--------------------------------------------
# Usando data.table com dados do IPEA data.
# Dados de abrangência nacional datificados por município das variáveis:
# i) população urbana, ii) população rural, iii) população
# econômicamente ativa urbana e iv) população econômicamente ativa
# rural. Fazer o download com todos os anos disponíveis. Todas as
# tabelas estão no tema social. As tabelas i e ii estão em "Demografia"
# e as iii e iv estão em "Mercado de trabalho".
# Muda o diretório de trabalho para onde estão os arquivos.
setwd("../datasets")
# Nomes dos arquivos.
f <- dir(pattern = "^ipeadata-")
f
# Lendo as tabelas mantendo todas em lista.
tabs <- sapply(f,
simplify = FALSE,
FUN = fread,
header = TRUE,
skip = 1,
sep = ";",
dec = ",",
quote = "")
str(tabs)
# Lendo as tabelas mantendo todas em lista.
pre <- "http://leg.ufpr.br/~walmes/ensino/ML/datasets/"
fls <- c("ipeadata-pea-rural.csv",
"ipeadata-pea-urban.csv",
"ipeadata-pop-rural.csv",
"ipeadata-pop-urban.csv")
f <- paste0(pre, fls)
tabs <- sapply(f,
simplify = FALSE,
FUN = fread,
header = TRUE,
skip = 1,
sep = ";",
dec = ",",
quote = "")
str(tabs)
## List of 4
## $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv:Classes 'data.table' and 'data.frame': 5596 obs. of 8 variables:
## ..$ Sigla : chr [1:5596] "AC" "AC" "AC" "AC" ...
## ..$ Código : int [1:5596] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## ..$ Município: chr [1:5596] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## ..$ 0001 : int [1:5596] NA NA 2832 NA NA 9244 NA 4028 NA NA ...
## ..$ 0001 : int [1:5596] NA 335 2514 NA NA 9981 NA 3834 NA 1437 ...
## ..$ 0001 : num [1:5596] NA 374 3317 NA NA ...
## ..$ 0001 : num [1:5596] 1560 295 3065 1448 1307 ...
## ..$
: int [1:5596] NA NA NA NA NA NA NA NA NA NA ...
## ..- attr(*, ".internal.selfref")=<externalptr>
## $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv:Classes 'data.table' and 'data.frame': 5596 obs. of 8 variables:
## ..$ Sigla : chr [1:5596] "AC" "AC" "AC" "AC" ...
## ..$ Código : int [1:5596] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## ..$ Município: chr [1:5596] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## ..$ 0001 : int [1:5596] NA NA 749 NA NA 2664 NA 472 NA NA ...
## ..$ 0001 : int [1:5596] NA 119 1590 NA NA 3244 NA 1038 NA 380 ...
## ..$ 0001 : num [1:5596] NA 601 4339 NA NA ...
## ..$ 0001 : num [1:5596] 1348 1089 3903 748 621 ...
## ..$
: int [1:5596] NA NA NA NA NA NA NA NA NA NA ...
## ..- attr(*, ".internal.selfref")=<externalptr>
## $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv:Classes 'data.table' and 'data.frame': 5596 obs. of 6 variables:
## ..$ Sigla : chr [1:5596] "AC" "AC" "AC" "AC" ...
## ..$ Código : int [1:5596] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## ..$ Município: chr [1:5596] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## ..$ 0001 : int [1:5596] 4792 1301 2410 825 738 22200 1562 10618 3894 4131 ...
## ..$ 0001 : int [1:5596] 4429 1339 7987 4198 3685 28470 3624 15482 3591 5301 ...
## ..$
: int [1:5596] NA NA NA NA NA NA NA NA NA NA ...
## ..- attr(*, ".internal.selfref")=<externalptr>
## $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv:Classes 'data.table' and 'data.frame': 5596 obs. of 6 variables:
## ..$ Sigla : chr [1:5596] "AC" "AC" "AC" "AC" ...
## ..$ Código : int [1:5596] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## ..$ Município: chr [1:5596] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## ..$ 0001 : int [1:5596] 0 1616 9992 3422 3058 26766 6477 7151 127 3575 ...
## ..$ 0001 : int [1:5596] 3506 2151 9026 1628 1521 38971 7404 11240 863 5794 ...
## ..$
: int [1:5596] NA NA NA NA NA NA NA NA NA NA ...
## ..- attr(*, ".internal.selfref")=<externalptr>
# A última coluna tem que ser descartada.
sapply(tabs, ncol)
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv
## 8
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv
## 8
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv
## 6
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv
## 6
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv`
## [1] "Sigla" "Código" "Município" "0001" "0001" "0001"
## [7] "0001" "\r"
##
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv`
## [1] "Sigla" "Código" "Município" "0001" "0001" "0001"
## [7] "0001" "\r"
##
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv`
## [1] "Sigla" "Código" "Município" "0001" "0001" "\r"
##
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv`
## [1] "Sigla" "Código" "Município" "0001" "0001" "\r"
# Nomes curtos para as colunas indentificadoras dos registros.
id <- c("sig", "id", "mun")
# Anos.
an <- c(1970, 1980, 1991, 2000)
# Notação: `a` e `p` para PEA e população; `r` e `u` para rural e
# urbana.
prefix <- c("ar", "au", "pr", "pu")
# Descartando e renomeando colunas.
i <- 1
tabs <- lapply(tabs,
FUN = function(tb) {
cols <- ncol(tb)
if (cols == 8) {
tb[, 8 := NULL]
names(tb) <- c(id, paste0(prefix[i], an))
} else if (cols == 6) {
tb[, 6 := NULL]
names(tb) <- c(id, paste0(prefix[i], an[3:4]))
}
i <<- i + 1
return(tb)
})
# Nomes das colunas.
sapply(tabs, colnames)
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv`
## [1] "sig" "id" "mun" "ar1970" "ar1980" "ar1991" "ar2000"
##
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv`
## [1] "sig" "id" "mun" "au1970" "au1980" "au1991" "au2000"
##
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv`
## [1] "sig" "id" "mun" "pr1991" "pr2000"
##
## $`http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv`
## [1] "sig" "id" "mun" "pu1991" "pu2000"
# Fazendo a junção dos dados de população para o ano de 2000.
pop <- merge(tabs[[3]], tabs[[4]], by = id)
str(pop)
## Classes 'data.table' and 'data.frame': 5596 obs. of 7 variables:
## $ sig : chr "AC" "AC" "AC" "AC" ...
## $ id : int 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## $ mun : chr "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## $ pr1991: int 4792 1301 2410 825 738 22200 1562 10618 3894 4131 ...
## $ pr2000: int 4429 1339 7987 4198 3685 28470 3624 15482 3591 5301 ...
## $ pu1991: int 0 1616 9992 3422 3058 26766 6477 7151 127 3575 ...
## $ pu2000: int 3506 2151 9026 1628 1521 38971 7404 11240 863 5794 ...
## - attr(*, ".internal.selfref")=<externalptr>
## - attr(*, "sorted")= chr "sig" "id" "mun"
#-----------------------------------------------------------------------
# Um pouco mais sobre junção.
# Fazendo operações de junção (merges ou joins) com o `data.table`.
# https://rstudio-pubs-static.s3.amazonaws.com
# /52230_5ae0d25125b544caab32f75f0360e775.html
# Exemplo pequeno com data.frame simples.
df1 <- data.frame(grr = c(1:5), nota = runif(5, 70, 100))
df2 <- data.frame(grr = c(3:9), falt = rpois(7, 5))
# Interseção (inner join).
merge(df1, df2, by = "grr")
## grr nota falt
## 1 3 96.54916 6
## 2 4 71.42119 5
## 3 5 87.81755 4
# União (outer join).
merge(df1, df2, by = "grr", all = TRUE)
## grr nota falt
## 1 1 86.48013 NA
## 2 2 85.83807 NA
## 3 3 96.54916 6
## 4 4 71.42119 5
## 5 5 87.81755 4
## 6 6 NA 8
## 7 7 NA 6
## 8 8 NA 6
## 9 9 NA 6
# Todos da esquerda (left join).
merge(df1, df2, by = "grr", all.x = TRUE)
## grr nota falt
## 1 1 86.48013 NA
## 2 2 85.83807 NA
## 3 3 96.54916 6
## 4 4 71.42119 5
## 5 5 87.81755 4
# Todos da direita (right join).
merge(df1, df2, by = "grr", all.y = TRUE)
## grr nota falt
## 1 3 96.54916 6
## 2 4 71.42119 5
## 3 5 87.81755 4
## 4 6 NA 8
## 5 7 NA 6
## 6 8 NA 6
## 7 9 NA 6
#-----------------------------------------------------------------------
# Um pouco de visualização para conhecer os dados.
# Histograma por estado usando a qplot().
qplot(log10(pu2000),
data = pop,
geom = "histogram",
facets = ~ sig)

# Usando a ggplot() seguida de camadas.
ggplot(data = pop,
aes(x = pr2000)) +
geom_histogram() +
scale_x_log10() +
facet_wrap(facets = ~ sig)

#-----------------------------------------------------------------------
# Exagerando no uso das camadas (um exemplo quase exaustivo).
ggplot(data = subset(pop, sig %in% c("PR", "SC", "RS")),
aes(x = pr1991, y = pr2000)) +
geom_point(aes(color = pr2000 > pr1991)) +
geom_abline(a = 0, b = 1, linetype = 2) +
scale_x_log10() +
scale_y_log10() +
stat_smooth(aes(x = pr1991, y = pr2000),
method = "lm",
formula = y ~ poly(x, degree = 2)) +
facet_wrap(facets = ~ sig,
ncol = 1,
strip.position = "right") +
labs(x = "Log 10 da população rural em 1991",
y = "Log 10 da população rural em 2000") +
scale_color_discrete(name = "População\ncresceu?") +
theme(panel.background = element_rect(fill = "white",
colour = "black"),
panel.grid.major = element_line(colour = "gray75"),
panel.grid.minor = element_line(colour = "gray80"),
strip.background = element_rect(colour = "black",
fill = "gray90"),
legend.position = "left")

# Visite.
# http://www.cookbook-r.com/Graphs/
# Documentação online oficial:
# http://ggplot2.tidyverse.org/reference/
# Mais exemplos:
# http://tutorials.iq.harvard.edu/R/Rgraphics/Rgraphics.html
#-----------------------------------------------------------------------
# Empilhar, juntar e desempilhar variáveis.
# Métodos para a classe `data.table`. Note a `merge()`, `melt()` e
# `dcast()`.
methods(class = "data.table")
## [1] all.equal anyDuplicated as.data.frame as.data.table as.list
## [6] as.matrix [<- [[<- $<- [
## [11] dcast dim dimnames<- dimnames duplicated
## [16] format head is.na melt merge
## [21] names<- na.omit print split subset
## [26] tail transform unique within
## see '?methods' for accessing help and source code
## Classes 'data.table' and 'data.frame': 5596 obs. of 7 variables:
## $ sig : chr "AC" "AC" "AC" "AC" ...
## $ id : int 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## $ mun : chr "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## $ ar1970: int NA NA 2832 NA NA 9244 NA 4028 NA NA ...
## $ ar1980: int NA 335 2514 NA NA 9981 NA 3834 NA 1437 ...
## $ ar1991: num NA 374 3317 NA NA ...
## $ ar2000: num 1560 295 3065 1448 1307 ...
## - attr(*, ".internal.selfref")=<externalptr>
x <- melt(tabs[[1]], id.vars = id)
str(x)
## Classes 'data.table' and 'data.frame': 22384 obs. of 5 variables:
## $ sig : chr "AC" "AC" "AC" "AC" ...
## $ id : int 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## $ mun : chr "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## $ variable: Factor w/ 4 levels "ar1970","ar1980",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ value : num NA NA 2832 NA NA ...
## - attr(*, ".internal.selfref")=<externalptr>
# Fazendo para todas as tabelas.
tabsm <- lapply(tabs, FUN = melt, id.vars = id)
str(tabsm)
## List of 4
## $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv:Classes 'data.table' and 'data.frame': 22384 obs. of 5 variables:
## ..$ sig : chr [1:22384] "AC" "AC" "AC" "AC" ...
## ..$ id : int [1:22384] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## ..$ mun : chr [1:22384] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## ..$ variable: Factor w/ 4 levels "ar1970","ar1980",..: 1 1 1 1 1 1 1 1 1 1 ...
## ..$ value : num [1:22384] NA NA 2832 NA NA ...
## ..- attr(*, ".internal.selfref")=<externalptr>
## $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv:Classes 'data.table' and 'data.frame': 22384 obs. of 5 variables:
## ..$ sig : chr [1:22384] "AC" "AC" "AC" "AC" ...
## ..$ id : int [1:22384] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## ..$ mun : chr [1:22384] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## ..$ variable: Factor w/ 4 levels "au1970","au1980",..: 1 1 1 1 1 1 1 1 1 1 ...
## ..$ value : num [1:22384] NA NA 749 NA NA ...
## ..- attr(*, ".internal.selfref")=<externalptr>
## $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv:Classes 'data.table' and 'data.frame': 11192 obs. of 5 variables:
## ..$ sig : chr [1:11192] "AC" "AC" "AC" "AC" ...
## ..$ id : int [1:11192] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## ..$ mun : chr [1:11192] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## ..$ variable: Factor w/ 2 levels "pr1991","pr2000": 1 1 1 1 1 1 1 1 1 1 ...
## ..$ value : int [1:11192] 4792 1301 2410 825 738 22200 1562 10618 3894 4131 ...
## ..- attr(*, ".internal.selfref")=<externalptr>
## $ http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv:Classes 'data.table' and 'data.frame': 11192 obs. of 5 variables:
## ..$ sig : chr [1:11192] "AC" "AC" "AC" "AC" ...
## ..$ id : int [1:11192] 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## ..$ mun : chr [1:11192] "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## ..$ variable: Factor w/ 2 levels "pu1991","pu2000": 1 1 1 1 1 1 1 1 1 1 ...
## ..$ value : int [1:11192] 0 1616 9992 3422 3058 26766 6477 7151 127 3575 ...
## ..- attr(*, ".internal.selfref")=<externalptr>
# Verifica se os nomes são os mesmos.
sapply(tabsm, names)
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-rural.csv
## [1,] "sig"
## [2,] "id"
## [3,] "mun"
## [4,] "variable"
## [5,] "value"
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pea-urban.csv
## [1,] "sig"
## [2,] "id"
## [3,] "mun"
## [4,] "variable"
## [5,] "value"
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-rural.csv
## [1,] "sig"
## [2,] "id"
## [3,] "mun"
## [4,] "variable"
## [5,] "value"
## http://leg.ufpr.br/~walmes/ensino/ML/datasets/ipeadata-pop-urban.csv
## [1,] "sig"
## [2,] "id"
## [3,] "mun"
## [4,] "variable"
## [5,] "value"
# Empilhar as tabelas criando uma só.
tab <- do.call(rbind, tabsm)
str(tab)
## Classes 'data.table' and 'data.frame': 67152 obs. of 5 variables:
## $ sig : chr "AC" "AC" "AC" "AC" ...
## $ id : int 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## $ mun : chr "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## $ variable: Factor w/ 12 levels "ar1970","ar1980",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ value : num NA NA 2832 NA NA ...
## - attr(*, ".internal.selfref")=<externalptr>
# Criar os fatores:
# zona = {rural, urbana};
# resp = {pea, pop},
# ano = {1970, 1980, 1991, 2000}.
# Testando.
substr(tab$variable[1:5], 2, 2)
## [1] "r" "r" "r" "r" "r"
substr(tab$variable[1:5], 1, 1)
## [1] "a" "a" "a" "a" "a"
substr(tab$variable[1:5], 3, 6)
## [1] "1970" "1970" "1970" "1970" "1970"
# Criando as novas variáveis.
tab[,
zona := factor(substr(variable, 2, 2),
levels = c("r", "u"),
labels = c("rural", "urbana"))]
tab[,
resp := factor(substr(variable, 1, 1),
levels = c("a", "p"),
labels = c("pea", "pop"))]
tab[,
ano := as.integer(substr(variable, 3, 6))]
str(tab)
## Classes 'data.table' and 'data.frame': 67152 obs. of 8 variables:
## $ sig : chr "AC" "AC" "AC" "AC" ...
## $ id : int 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## $ mun : chr "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## $ variable: Factor w/ 12 levels "ar1970","ar1980",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ value : num NA NA 2832 NA NA ...
## $ zona : Factor w/ 2 levels "rural","urbana": 1 1 1 1 1 1 1 1 1 1 ...
## $ resp : Factor w/ 2 levels "pea","pop": 1 1 1 1 1 1 1 1 1 1 ...
## $ ano : int 1970 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
## - attr(*, ".internal.selfref")=<externalptr>
# Passar o tipo de resposta para as colunas (desempilhar).
tab <- dcast(tab,
formula = sig + id + mun + zona + ano ~ resp,
value.var = "value")
str(tab)
## Classes 'data.table' and 'data.frame': 44768 obs. of 7 variables:
## $ sig : chr "AC" "AC" "AC" "AC" ...
## $ id : int 1200013 1200013 1200013 1200013 1200013 1200013 1200013 1200013 1200054 1200054 ...
## $ mun : chr "Acrelândia" "Acrelândia" "Acrelândia" "Acrelândia" ...
## $ zona: Factor w/ 2 levels "rural","urbana": 1 1 1 1 2 2 2 2 1 1 ...
## $ ano : int 1970 1980 1991 2000 1970 1980 1991 2000 1970 1980 ...
## $ pea : num NA NA NA 1560 NA ...
## $ pop : num NA NA 4792 4429 NA ...
## - attr(*, ".internal.selfref")=<externalptr>
## - attr(*, "sorted")= chr "sig" "id" "mun" "zona" ...
#-----------------------------------------------------------------------
# Extração de medidas resumo.
# PEA média do Brasil por zona e ano.
tab[,
.(`media` = mean(pea, na.rm = TRUE)),
by = .(zona, ano)]
## zona ano media
## 1: rural 1970 3292.430
## 2: rural 1980 3253.894
## 3: rural 1991 2855.916
## 4: rural 2000 2374.467
## 5: urbana 1970 4188.517
## 6: urbana 1980 7579.409
## 7: urbana 1991 10160.366
## 8: urbana 2000 11692.625
# Filtrando só para o Paraná.
tab[sig == "PR",
.(`media` = mean(pea, na.rm = TRUE)),
by = .(zona, ano)]
## zona ano media
## 1: rural 1970 5104.611
## 2: rural 1980 3978.538
## 3: rural 1991 2880.750
## 4: rural 2000 2079.119
## 5: urbana 1970 2800.785
## 6: urbana 1980 5894.024
## 7: urbana 1991 8303.906
## 8: urbana 2000 9579.606
#-----------------------------------------------------------------------
# Gráficos.
ggplot(data = tab,
aes(x = pea, color = zona)) +
geom_density() +
geom_rug() +
scale_x_log10() +
facet_wrap(facets = ~ ano, ncol = 1)

# TODO: adicionar linhas verticais. Trocar `ano` e `zona` de
# lugar. Refazer apenas para os estados do sul. Criar boxplot.
#-----------------------------------------------------------------------
# Outra possibilidade é usar o pacote `sqldf` que permite uso de
# instruções SQL para manipulação das tabelas de dados no R.
browseURL("https://cran.r-project.org/web/packages/sqldf/index.html")
# Alguns tutoriais:
# https://jasdumas.github.io/tech-short-papers/sqldf_tutorial.html
# http://www.burns-stat.com/translating-r-sql-basics/
# http://anythingbutrbitrary.blogspot.com.br/2012/08/manipulating-data-frames-using-sqldf.html
#-----------------------------------------------------------------------