[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