[R-br] Leitura de dados da PNAD 2008 com o pacote dicionariosIBGE

Leonardo Ferreira Fontenelle leonardof em leonardof.med.br
Domingo Agosto 31 11:14:56 BRT 2014


Em benefício dos futuros leitores desta thread, aviso que depois percebi
que a chamada para read.fwf() precisa também do argumento na.string =
"", para reconhecer adequadamente os valores faltantes.

De qualquer forma, o seguinte código, que depende do pacote "LaF", abre
o arquivo bem mais rápido:


tipos.laf.domicilios <- c(
  "integer", "categorical", "categorical", "categorical", "categorical", 
  "integer", "integer", "categorical", "categorical", "categorical",
  "categorical", "integer", "integer", "categorical", "double",
  "double", "categorical", "categorical", "categorical", "categorical",
  "categorical", "categorical", "categorical", "integer", "categorical",
  "categorical", "categorical", "categorical", "categorical",
  "categorical",
  "categorical", "categorical", "categorical", "categorical",
  "categorical",
  "categorical", "categorical", "categorical", "categorical",
  "categorical",
  "categorical", "categorical", "categorical", "categorical",
  "categorical",
  "categorical", "integer", "integer", "categorical", "integer",
  "double", "integer", "double", "double", "double",
  "integer", "double", "double", "categorical", "categorical",
  "categorical", "double", "integer", "double", "categorical",
  "categorical", "categorical", "categorical", "categorical", "string")

laf.domicilios <- laf_open_fwf(filename = "2008/dados/DOM2008.txt",
                               column_types = tipos.laf.domicilios[-2],
                               column_widths = dicdom2008$tamanho[-2],
                               column_names = dicdom2008$cod[-2])

uf.domicilios = data.frame(UF = factor(substr(lapply(laf.domicilios[,
"V0102"]$V0102,
                                          as.character), 1, 2)))

# As seguintes colunas têm valores 10^12 - 1 que na verdade são NA:
limpar.missing.domicilios <- c("V0208", "V0209", "V4614", "V4619",
"V4621")


Quer dizer, a função laf_open_fwf só cria uma conexão para o arquivo,
mas rodar summary(laf.domicilios[ , ]) é bem mais rápido do que ler o
arquivo com read.fwf() e então rodar o summary().

Abraços,
-- 
Leonardo Ferreira Fontenelle
http://lattes.cnpq.br/9234772336296638

Em Sáb 30 ago. 2014, às 12:49, Leonardo Ferreira Fontenelle escreveu:
> Este código importa os dados com sucesso:
> 
> # Pelo dicionario, o terceiro campo (variável de controle) engloba o
> segundo (UF)
> # Mas isso é dificil para a função entender.
> novodic <- within(dicdom2008, {inicio[3] <- 7; tamanho[3] <- 6})
> amostra <- read.fwf(file = "2008/dados/DOM2008.txt",
>                     widths = novodic$tamanho,
>                     header = FALSE,
>                     col.names = novodic$cod,
>                     strip.white = TRUE)
> amostra[, 3] <- factor(paste0(amostra[, 2], amostra[, 3]))
> 
> Fornecer esse "novodic" em vez do dicdom2008 para a função le.pesquisa()
> do pacote dicionariosIBGE não resolveu o problema já relatado.
> 
> -- 
> Leonardo Ferreira Fontenelle
> http://lattes.cnpq.br/9234772336296638
> 
> Em Sáb 30 ago. 2014, às 11:45, Leonardo Ferreira Fontenelle escreveu:
> > Não sei o quanto ajuda, mas percebi que o dataframe gerado está com o
> > número errado de linhas:
> > 
> > Num terminal:
> > . wc DOM2008.txt --lines
> > 150591 DOM2008.txt
> > 
> > No R:
> > . nrow(amostra)
> > [1] 1015101
> > 
> > Essa diferença não se resolve pedindo ao le.pesquisa() para ler todas as
> > variáveis:
> > . amostra <- le.pesquisa(dicdom2008,
> > "~/Dropbox/Cobertura/2008/dados/DOM2008.txt", codigos = dicdom2008[, 2],
> > nlines = 150591)
> >   |======================================================================|
> >   100%
> > . nrow(amostra)
> > [1] 1015101
> > 
> > -- 
> > Leonardo Ferreira Fontenelle
> > http://lattes.cnpq.br/9234772336296638
> > 
> > Em Sáb 30 ago. 2014, às 11:19, Leonardo Ferreira Fontenelle escreveu:
> > > Bom dia, pessoal.
> > > 
> > > Estou começando a namorar os microdados da Pesquisa Nacional por Amostra
> > > de Domicílios de 2008, mas não estou conseguindo utilizar o pacote
> > > dicionariosIBGE para ler os microdados. Na saída abaixo, substituí o
> > > prompt ">" por "." para evitar que clientes de e-mail interpretem como
> > > citação de e-mails prévios.
> > > 
> > > . library("dicionariosIBGE")
> > > . data(dicPNAD2008)
> > > . dicdom2008
> > >    inicio    cod tamanho                           desc
> > > 1       1  V0101       4                ANO DA PESQUISA
> > > 2       5     UF       2           UNIDADE DA FEDERACAO
> > > 3       5  V0102       8             NUMERO DE CONTROLE
> > > 4      13  V0103       3                NUMERO DE SERIE
> > > 5      16  V0104       2             TIPO DE ENTREVISTA
> > > [...]
> > > . amostra <- le.pesquisa(dicdom2008,
> > > "~/Dropbox/Cobertura/2008/dados/DOM2008.txt", codigos = c("V0101", "UF",
> > > "V0102", "V0103", "V4105", "V4106", "V4606", "V4604", "V4605", "V4606",
> > > "V4607", "V4608", "V4609", "V4610", "V4611", "SUBAMO", "V0223"), nlines
> > > = 150591)
> > >   |=====================================================================| 100%
> > > . summary(amostra$V0101)
> > >    Mode    NA's 
> > > logical 1015101 
> > > . summary(amostra$UF)
> > >    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
> > >    0.00    3.00   12.00   19.69   31.00   99.00  264343 
> > > 
> > > Como os microdados da PNAD 2008 estão reponderados utilizando
> > > informações posteriores à publicação original do arquivo, considerei a
> > > possibilidade de que a organização dos dados tivesse mudado. Mas,
> > > conferindo o dicionário de dados atualmente disponibilizado, vi que os
> > > números de início, código e tamanho continuam os mesmos, pelo menos para
> > > as primeiras variáveis (são setenta variáveis, só neste banco de dados).
> > > 
> > > O que será que estou fazendo de errado?
> > > 
> > > Grato,
> > > 
> > > Leonardo Ferreira Fontenelle
> > > http://lattes.cnpq.br/9234772336296638


Mais detalhes sobre a lista de discussão R-br