
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