PNAD: Baixar microdados e converter para csv no R (script manual)
################################################################################
## 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.                                          ## 
################################################################################ 

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

library(descr)
library(XLConnect)
## Se houver falha no XLConnect, verifique se a versão do Java instalada na sua
## máquina(Java 64bit ou Java 32bit) é a mesma do R (R 64bit ou R 32bit)

## Defina a pasta onde os arquivos finais serão salvos
setwd("C:\\Users\\...")

## 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();

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

## Abaixo, digite 'DOM' para baixar os microdados referentes aos domicílios 
## Ou 'PES' para os referentes às pessoas
ref <- 'DOM'

## Selecione anos (não há pnad 2010)
for(i in c(2001:2009,2011:2014)){

########################### A PARTIR DAQUI NÃO EDITE ###########################

year <- as.character(i)

## Gerar urls do IBGE para baixar arquivos
  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")

## Baixar cada arquivo zip contendo dados e dicionários
    download.file(ftp.path,tfzip, mode='wb',method='libcurl')

## Descompactar arquivo de dicionário
    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])

## 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()
## Abaixo segue o mesmo procedimento para 2013 e 2014
  } else {
    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()
  }
}
## Para remover a pasta temporária e limpar objetos utilizados, rode a função unlink
## abaixo. Para algumas funções, será necessário reiniciar o R após a remoção, por
## isso está fechado
#unlink(td, recursive = T)

## Limpe os objetos utilizados
rm(list = ls())
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License