Saltar al contenido

Leer datos SAS sas7bdat en R

Este enunciado ha sido aprobado por expertos para asegurar la veracidad de nuestro tutorial.

Solución:

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

Este método es superior por dos razones:

1) No tuvo ningún problema para leer el archivo vinculado anteriormente 2) Es mucho (Yo 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) como 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 

Así es–haven::read_sas toma (en promedio) 99.5% menos tiempo que sas7bdat::read.sas7bdat.

actualización menor

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

# 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 attributes 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 usted necesitar estas attributes (Sé que algunas personas están particularmente interesadas en el labels, por ejemplo), tal vez read.sas7bdat es la opción para usted después de todo.

A partir del 18 de enero de 2018, la biblioteca Have R cargará 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 dentro de 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"

Problema

El problema parece que los archivos que está tratando de usar tienen un formato deficiente. Específicamente, las celdas en blanco no están codificadas (R usos NA) pero simplemente se dejan vacíos. Al intentar cargar el archivo delimitado por tabuladores, esto crea problemas para R, que cree que hay un número incorrecto de columnas.

Solución alternativa con archivos SAS

Encontré una solución al cargar el archivo SAS usando el sas7bdat paquete y luego recodificar 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 se considera actualmente experimental en el momento de la escritura por su autor. Por lo tanto, es posible que no cargue todos los archivos sas, y revisaría minuciosamente los que carga en busca de inconsistencias antes de usarlos.

Solución no R

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

Te mostramos comentarios y calificaciones

Te invitamos a añadir valor a nuestra información contribuyendo tu veteranía en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *