PNAD: Baixar microdados e converter para csv no R
################################################################################
## Baixando os microdados da PNAD anual e convertendo para csv                ##
## Guilherme Cemin de Paula                                                   ##
## http://cemin.wikidot.com                                                   ##
## cemin@outlook.com                                                          ##
################################################################################
## Este script fará o download dos microdados da PNAD anual do site do IBGE e ##
## os converterá para o formato csv.                                          ## 
## Ele está automatizado através do uso de caixas de diálogo. Se preferir, o  ##
## script manual se encontra na seguinte página                               ##
## http://cemin.wikidot.com/pnadcsvm                                          ##
################################################################################ 

## O script utilizará os seguintes pacotes. Instale apenas na primeira vez.
# install.packages('descr') # Converte os microdados para csv
# install.packages('XLConnect') # Importa arquivos xls para o R
# install.packages('svDialogs') # Caixas de diálogo

## Possivelmente a primeira caixa de diálogo abrirá minimizada

########################### A PARTIR DAQUI NÃO EDITE ###########################
library(descr)
library(svDialogs)
library(XLConnect)
## Se houver problema para carregar o pacote XLConnect verifique se a versão do
## Java instalada na sua máquina (Java 64bits ou Java 32bits) é a mesma do R 
## (R 64bits ou R 32bits)

setwd(dlgDir(default = getwd(), title='Defina a pasta em que os arquivos serão salvos')$res)

## Criando arquivos e diretório temporários
tfzip <- tempfile(fileext='.zip'); tfzip2 <- tempfile(pattern='2',fileext='.zip')  
tf7z <- tempfile(pattern='7za', tmpdir=tempdir(), fileext='.exe'); td <- tempdir()

dlgMessage(c('A seguir selecione os anos desejados',
             'Utilize CTRL ou SHIFT para selecionar mais de um ano',
             'Não há PNAD 2010'))
res <- dlgList(c(2001:2009,2011:2013), multiple = TRUE, title = 'Selecione os anos')$res
if (!length(res)) {
  stop('Você cancelou a escolha. Rode o script novamente.')
} else {
  years <- res

dlgMessage(c('Deseja os dados referentes aos Domicílios ou Pessoas?',
             'Selecione apenas um'))
res <- dlgList(c('DOM','PES'), multiple = F)$res
if (!length(res)) {
  cat('Você cancelou a escolha. Rode o script novamente.')
  stop()
} else {
  ref <- res

rm(res)

## Baixando o 7zip para descompactar os microdados. O 7zip traz mais funções que o unzip nativo do R
## O arquivo é um executável que será baixado no diretório temporário e deletado no fim do processo
download.file('http://cemin.wikidot.com/local--files/raisrm/7za.exe', tf7z, mode='wb')

for (i in years) {
  year <- as.character(i)

## Gerar urls do IBGE para baixar arquivos (padrão para 2001-12, 2013-14 são diferentes, ver abaixo)
  if(year<2013){
    ftp.path <- paste0(
        'ftp://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_anual/microdados/reponderacao_2001_2012/PNAD_reponderado_',
        year, if (year %in% c(2003, 2007,2009:2012)) '_20150814', '.zip')
  if(year==2005){ #problema no dicionário de 2005
        ftp.path2 <-
          'http://cemin.wikidot.com/local--files/pnadcsv/dic2005.zip'
        }

## Baixar cada arquivo zip contendo dados e dicionários
    download.file(ftp.path, tfzip, mode='wb', method='libcurl')
    if(year==2005){
          download.file(ftp.path2, tfzip2, mode='wb', method='libcurl')
        }

## Descompactar arquivo de dicionário
    dirdic <- paste0(td,'/dic',year,sep='')
    dir.create(dirdic)
    if(year != 2005){
        system(paste0(tf7z,' e ',tfzip,' -o',dirdic,' dic*.* -r -y',sep=''))
        } else {
          system(paste0(tf7z,' e ',tfzip2,' -o',dirdic,' dic*.* -r -y',sep=''))
          }
    dicfiles <- list.files(dirdic)
    ifelse(ref=='DOM',
           dicfile<-dicfiles[1],
           dicfile<-dicfiles[2])

## O dicionário encontra-se no formato xls (excel). Importando para o R e ajustando
    ifelse(year<2004,
           dic <- readWorksheetFromFile(paste0(dirdic,'/',dicfile),sheet=1,autofitRow=T,
                                        header=T,startCol=1,startRow=3,endCol=3),
           dic <- readWorksheetFromFile(paste0(dirdic,'/',dicfile),sheet=1,autofitRow=T,
                                        header=T,startCol=1,startRow=2,endCol=3))
    dic <- dic[complete.cases(dic),]
    colnames(dic) <- c('inicio', 'tamanho', 'variavel')
    write.csv(dic, file = paste0(dirdic,'/','dic',year,'.csv'))
    dic <- read.csv(paste0(dirdic,'/','dic',year,'.csv'), header=T)
    dic <- dic[c('inicio', 'tamanho', 'variavel')]
    end_dic <- dic$inicio + dic$tamanho - 1

## Descompactando os microdados (txt)
    dirtxt <- paste0(td,'/txt',year,sep='')
    dir.create(dirtxt)
    ifelse(ref=='DOM',
           system(paste0(tf7z,' e ',tfzip,' -o',dirtxt,' DOM*.* -r -y',sep='')),
           system(paste0(tf7z,' e ',tfzip,' -o',dirtxt,' PES*.* -r -y',sep='')))
    txtfile <- list.files(dirtxt)
    file.path <- paste0(dirtxt,'/',txtfile,sep='')

## Convertendo e salvando em csv
    if(ref=='DOM') {
      fwf2csv(fwffile=file.path, csvfile=paste0('dom',year,'.csv'), names=dic$variavel, begin=dic$inicio, end=end_dic)
    } else {
      fwf2csv(fwffile=file.path, csvfile=paste0('pes',year,'.csv'), names=dic$variavel, begin=dic$inicio, end=end_dic)
    }

## Liberar RAM a cada loop
    gc()
  } else {

## Abaixo segue o mesmo procedimento para 2013 e 2014
    if(year==2013){
           ftp.path1 <- 'ftp://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_anual/microdados/2013/Dicionarios_e_input_20150814.zip'
           ftp.path2 <- 'ftp://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_anual/microdados/2013/Dados.zip'
    } else {
            ftp.path1 <- 'ftp://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_anual/microdados/2014/Dicionarios_e_input_20160406.zip'
            ftp.path2 <- 'ftp://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_anual/microdados/2014/Dados_20160406.zip'
    }
    download.file(ftp.path1,destfile=tfzip, mode='wb',method='libcurl')
    download.file(ftp.path2,destfile=tfzip2, mode='wb',method='libcurl')
    dirdic <- paste0(td,'/dic',year,sep='')
    dir.create(dirdic)
    system(paste0(tf7z,' e ',tfzip,' -o',dirdic,' dic*.* -r -y',sep=''))
    dicfiles <- list.files(dirdic)
    ifelse(ref=='DOM',
           dicfile<-dicfiles[1],
           dicfile<-dicfiles[2])
    dic <- readWorksheetFromFile(paste0(dirdic,'/',dicfile),sheet=1,autofitRow=T,
                                 header=T,startCol=1,startRow=2,endCol=3)
    dic <- dic[complete.cases(dic),]
    colnames(dic) <- c('inicio', 'tamanho', 'variavel')
    write.csv(dic,file=paste0(dirdic,'/','dic',year,'.csv'))
    dic <- read.csv(paste0(dirdic,'/','dic',year,'.csv'), header=T)
    dic <- dic[c('inicio', 'tamanho', 'variavel')]
    end_dic <- dic$inicio + dic$tamanho - 1
    dirtxt <- paste0(td,'/txt',year,sep='')
    dir.create(dirtxt)
    ifelse(ref=='DOM',
           system(paste0(tf7z,' e ',tfzip2,' -o',dirtxt,' DOM*.* -r -y',sep='')),
           system(paste0(tf7z,' e ',tfzip2,' -o',dirtxt,' PES*.* -r -y',sep='')))
    txtfile <- list.files(dirtxt)
    file.path <- paste0(dirtxt,'/',txtfile,sep='')
    if(ref=='DOM'){
      fwf2csv(fwffile=file.path, csvfile=paste0('dom',year,'.csv'), names=dic$variavel, begin=dic$inicio, end=end_dic)
    } else {
      fwf2csv(fwffile=file.path, csvfile=paste0('pes',year,'.csv'), names=dic$variavel, begin=dic$inicio, end=end_dic)
    }
    gc()
  }
}
dlgMessage('Fim do processo. Se não houve erros os arquivos devem estar na pasta indicada') 

## Deletar pasta temporária e limpar objetos utilizados
if(okCancelBox('Remover a pasta temporária? \n Se deseja continuar usando o R não remova')){ 
unlink(td, recursive = T)
rm(list = ls())
} else { 
rm(list = ls())}

dlgMessage(c('Em caso de dúvidas ou erros', 'cemin@outlook.com'))  
}
}
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License