Lea los datos SAS sas7bdat en R

¿Qué opciones tiene R para leer archivos en el formato SAS nativo, sas7bdat , en R?

El NCES Common Core , por ejemplo, contiene un extenso repository de archivos de datos guardados en este formato. Para ser más concretos, centrémonos en tratar de leer en este archivo de LEA Universe en 1997-98, que contiene datos demográficos del nivel de la agencia de educación para las entidades en todos los estados que comienzan de la A a la I.

Aquí hay una vista previa de SAS de los datos:

sas_preview

¿Cuál es la forma más sencilla de llevar estos datos a mi entorno R? No tengo ninguna versión de SAS disponible y no estoy dispuesto a pagar, por lo que simplemente convertirla a .csv sería una molestia.

sas7bdat funcionó bien para todos menos uno de los archivos que estaba viendo (específicamente, este ); al informar el error al desarrollador de sas7bdat , Matthew Shotwell, también me apuntó hacia el paquete de Hadley’s read_sas en R, que también tiene un método read_sas .

Este método es superior por dos razones:

1) No tuvo ningún problema para leer el archivo vinculado anteriormente 2) Es mucho (estoy hablando mucho ) más rápido que read.sas7bdat . Aquí hay un punto de referencia rápido (en este archivo, que es más pequeño que los demás) para evidencia:

 microbenchmark(times=10L, read.sas7bdat("psu97ai.sas7bdat"), read_sas("psu97ai.sas7bdat")) Unit: milliseconds expr min lq mean median uq max neval cld read.sas7bdat("psu97ai.sas7bdat") 66696.2955 67587.7061 71939.7025 68331.9600 77225.1979 82836.8152 10 b read_sas("psu97ai.sas7bdat") 397.9955 402.2627 410.4015 408.5038 418.1059 425.2762 10 a 

haven::read_sas toma (en promedio) 99.5% menos de tiempo que sas7bdat::read.sas7bdat .

actualización menor

Anteriormente no era capaz de determinar si los dos métodos producían los mismos datos (es decir, que ambos tienen los mismos niveles de fidelidad con respecto a la lectura de los datos), pero finalmente lo han hecho:

 # Keep as data.tables sas7bdat <- setDT(read.sas7bdat("psu97ai.sas7bdat")) haven <- setDT(read_sas("psu97ai.sas7bdat")) # read.sas7bdat prefers strings as factors, # and as of now has no stringsAsFactors argument # with which to prevent this idj_factor <- sapply(haven, is.factor) # Reset all factor columns as characters sas7bdat[ , (idj_factor) := lapply(.SD, as.character), .SDcols = idj_factor] # Check equality of the tables all.equal(sas7bdat, haven, check.attributes = FALSE) # [1] TRUE 

Sin embargo, tenga en cuenta que read.sas7bdat ha mantenido una lista masiva de atributos para el archivo, presumiblemente un remanente de SAS:

 str(sas7bdat) # ... # - attr(*, "column.info")=List of 70 # ..$ :List of 12 # .. ..$ name : chr "NCESSCH" # .. ..$ offset: int 200 # .. ..$ length: int 12 # .. ..$ type : chr "character" # .. ..$ format: chr "$" # .. ..$ fhdr : int 0 # .. ..$ foff : int 76 # .. ..$ flen : int 1 # .. ..$ label : chr "UNIQUE SCHOOL ID (NCES ASSIGNED)" # .. ..$ lhdr : int 0 # .. ..$ loff : int 44 # .. ..$ llen : int 32 # ... 

Entonces, si por casualidad necesitas estos atributos (sé que algunas personas son particularmente entusiastas con las label , por ejemplo), quizás read.sas7bdat sea ​​la opción para ti después de todo.

Problema

Parece que el problema es que los archivos que intenta utilizar están mal formateados. Específicamente, las celdas en blanco no están codificadas ( R usa NA ) pero simplemente se dejan vacías. Al intentar cargar el archivo delimitado por tabuladores, esto crea problemas para R que piensa que hay números incorrectos de columnas.

Solución con archivos SAS

He encontrado una solución al cargar el archivo SAS utilizando el paquete sas7bdat y luego recodificar las celdas en blanco ( "" ) como NA:

 install.packages("sas7bdat") require("sas7bdat") download.file("http://nces.ed.gov/ccd/Data/zip/ag121a_supp_sas.zip", destfile = "sas.zip") unzip("sas.zip") sas <- read.sas7bdat(file = "ag121a_supp.sas7bdat", debug = FALSE) sas[sas == ""] <- NA 

Sin embargo, hay dos problemas con este método a tener en cuenta:

  1. Es lento (ver comentarios)
  2. sas7bdat paquete sas7bdat actualmente se considera experimental al momento de escribir por su autor. Por lo tanto, es posible que no cargue todos los archivos sas, y antes de su uso verificaría a fondo los que contiene las incoherencias.

Solución no R

No es exactamente canónico, pero también puede descargar los archivos delimitados por tabuladores, abrirlos en LibreOffice Calc (Microsoft Excel parece estropear las cosas) y buscar y reemplazar todo buscando "" y reemplazando con NA .

A partir del 18 de enero de 2018, la biblioteca refugio R cargará los conjuntos de datos sas y stata en el entorno R. En R, simplemente:

 library(haven) data <- read_sas("C:/temp/mysasdataset.sas7bdat") View(data) 

También puede cargar los datos manualmente en R studio. En el panel de entorno, elija

Importar conjunto de datos> Desde SAS ...

Seleccione la ubicación del archivo y haga clic en "Importar"