Como importar os microdados do Censo da Educação Superior no R

ineprTentando solucionar a dúvida de um leitor que postou um comentário aqui no Metodologia Política, me deparei com uma situação nova, de fácil solução, mas que pode dar um pouco de dor de cabeça até descobrir o caminho das pedras. Trata-se de um problema de encode com os dados do Censo da Educação Superior.

Como o INEP disponibiliza os dados do Censo da Educação Superior com dicionários para o SPSS e para o SAS, tentei importar esses dados utilizando as funções; fwf2csv() desenvolvida por Marcos F. Silva, parse.SAScii() e read.SAScii.sqlite() desenvolvidas por Anthony Damico, e todas retornavam uma mensagem de erro.

Então busquei identificar qual era o encode padrão. No terminal do Mac executei o seguinte comando:

file -I INPUT_SAS_CURSO.sas

identifiquei que o encode é ASCII, para mudar para UTF8, fiz:

iconv -f ASCII -t UTF-8 INPUT_SAS_CURSO.sas > INPUT_SAS_CURSO_utf8.sas

Após alterar o encode do dicionário, realizei o mesmo processo com o arquivo CURSO.txt. Bastou repetir o velho processo de importação que tudo ocorreu bem.

Para identificar o encode no Linux, basta usar o comando:

file i- nome.do.arquivo

Há muito tempo não uso o Windows, não sei como resolver isso no sistema da Microsoft. Mas acho que esse erro não vai ocorrer se tentar abrir os microdados do Censo da Educação Superior no Windows.


rm(list = ls(all = TRUE))
setwd("~/Dropbox/R-workspace/Censo da Educacao Superior/")
dir()

# ------------------------------

# importando microdados com as funções desenvolvidas por Marcos F. Silva
# remove todos os comentários dos dicionários

# carregando as funções
source("fwf2csv.R")
source("getdic.R")
source("txt2df.R")

# no terminal de um sistema Mac, utilizar os seguintes comandos para
# identificar qual o encode do arquivo dos arquivos
#
# file -I INPUT_SAS_CURSO.sas
#
# agora sabemos que o arquivo usa ASCII, para transformá-lo em UTF-8
#
# iconv -f ASCII -t UTF-8 INPUT_SAS_CURSO.sas > INPUT_SAS_CURSO_utf8.sas
#
# vamos identificar o encode do arquivo que contém os dados
#
# file -I CURSO.txt
#
# este é ISO-8859-1, para transformar para UTF-8
#
# iconv -f ISO-8859-1 -t UTF-8 CURSO.txt > CURSO <- utf8.txt
#
# para identificar o encode no Linux usar file i- nome.do.arquivo

# lendo o dicionário
dic.curso <- getdic("INPUT_SAS_CURSO_utf8.sas")
head(dic.curso)

# gerando o arquivo csv
fwf2csv(input = "CURSO_utf8.txt", output = "CURSO.csv", dic = dic.curso, colunas = dic.curso$cod)

curso2 <- read.csv2("CURSO.csv")
head(curso2)
dim(curso2)

# ------------------------------

# outro caminho para importar os dados utilizando dicionários do SAS agora
# os dados são carregados no R

library(SAScii)

parse.SAScii("INPUT_SAS_CURSO.sas", begin = 23)  # aparece uma mensagem de erro
parse.SAScii("INPUT_SAS_CURSO_utf8.sas", begin = 23)  # agora funciona

x <- read.SAScii("CURSO_utf8.txt", "INPUT_SAS_CURSO_utf8.sas")
head(x)
dim(x)

# ------------------------------

# Os processos feitos acima são demorados quando realizado em arquivos
# grandes, uma solução é utilizar funções pensadas para resolver esses
# problemas

# lendo o arquivo alunos

rm(fwf2csv)

library(sqldf)

# criar uma base de dados
sqldf("attach ces2010 as new")

# importar a função desenvolvida por Anthony Damico
# https://raw.github.com/ajdamico/usgsd/master/SQLite/read.SAScii.sqlite.R
#
# e carregar direto do computador
source("read.SAScii.sqlite.R")

# estabelecer conexão com a base de dados
drv <- dbDriver("SQLite")
con <- dbConnect(drv, dbname = "ces2010")

# verificar as tabelas da base de dados ces2010 como a base acabou de ser
# criada esta limpa
dbListTables(con)

# apenas o dicionário precisa ser convertido para encode utf8 quando
# utiliza-se a função read.SAScii.sqlite()
#
# testar se o dicionário em formato sas esta sendo lido corretamente
parse.SAScii("INPUT_SAS_ALUNO_utf8.sas")

# transformar o arquivo de alunos do INEP direto em uma base SQLite
read.SAScii.sqlite(fn = "/Volumes/SAMSUNG/roney/Documentos/Microdados/Censo Educacao Superior/micro_censo_edu_superior2010/DADOS/ALUNO.txt",
    sas_ri = "INPUT_SAS_ALUNO_utf8.sas", tl = TRUE, tablename = "aluno", db = con)

# testar se o dicionário em formato SAS esta sendo lido corretamente
parse.SAScii("INPUT_SAS_CURSO_utf8.sas")

# transformar o arquivo de cursos do INEP direto em uma base SQLite
read.SAScii.sqlite(fn = "/Volumes/SAMSUNG/roney/Documentos/Microdados/Censo Educacao Superior/micro_censo_edu_superior2010/DADOS/CURSO.txt",
    sas_ri = "INPUT_SAS_CURSO_utf8.sas", tl = TRUE, tablename = "curso", db = con)

dbListTables(con)
dbGetQuery(con, "select * from curso limit 3")
dbGetQuery(con, "select * from aluno limit 3")

## Quando utilizar a função read.SAScii.sqlite() é importante não carregar
## a função fwf2csv() elaborada por Marcos f Silva, pois, ela gera
## conflito com a função fwf2csv() do pacote 'descr', que é utilizada via
## read.SAScii.sqlite()
##
## uma opção é fazer rm(fwf2csv)
## ----------------------------------------------

Sugestões? Críticas?
Um abraço,

Roney Fraga

Fatal error: Uncaught Exception: 12: REST API is deprecated for versions v2.1 and higher (12) thrown in /home/storage/4/6f/c7/pesquisamaconica/public_html/metodologiapolitica/wp-content/plugins/seo-facebook-comments/facebook/base_facebook.php on line 1273