Lire les données SAS sas7bdat dans R

quelles options R a-t-il pour lire des fichiers au format natif SAS, sas7bdat, dans R?

nce Common Core, par exemple, contient un vaste dépôt de fichiers de données enregistrés dans ce format. Pour être concret, concentrons-nous sur la lecture en le fichier de LEA Univers en 1997-98, qui contient de l'éducation-au niveau de l'agence de la démographie pour les entités dans tous les états, en commençant par Un I.

voici un aperçu de SAS de la données:

sas_preview

Quelle est la façon la plus simple d'apporter ces données dans mon environnement R? Je n'ai pas de version de SAS disponible et je ne suis pas prêt à payer, donc je le convertit simplement en .csv serait un tracas.

21
demandé sur MichaelChirico 2015-05-02 22:58:00

3 réponses

sas7bdat fonctionnait bien pour tous les fichiers sauf un que je regardais (spécifiquement,celui-ci); dans les rapports de l'erreur à l' sas7bdat développeur, Matthew Shotwell, il m'a aussi indiqué la direction de Hadley haven package dans R, ce qui a aussi un read_sas méthode.

Cette méthode est supérieure pour deux raisons:

1) Il n'a pas eu de difficulté à lire le fichier relié ci-dessus 2) C'est beaucoup (je parle beaucoup) plus rapide que read.sas7bdat. Voici un benchmark rapide (sur le fichier, qui est plus petite que les autres) pour preuve:

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 

C'est vrai--haven::read_sas a (en moyenne) 99.5% moins de tempssas7bdat::read.sas7bdat.

mise à jour mineure

auparavant, je n'étais pas en mesure de déterminer si les deux méthodes produisaient les mêmes données (c.-à-d. que les deux méthodes avaient des niveaux égaux de fidélité en ce qui concerne la lecture). les données), mais ont finalement fait:

# 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

cependant, notez que read.sas7bdat a conservé une liste massive d'attributs pour le fichier, probablement un holdover 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
# ...

Donc, si par hasard vous besoin ces attributs (Je sais que certaines personnes sont particulièrement friands de labels, par exemple), peut-être read.sas7bdat est l'option pour vous après tout.

34
répondu MichaelChirico 2017-12-22 08:34:19

Problème

Le problème ressemble les fichiers que vous tentez d'utiliser sont mal formatés. Plus précisément, les cellules Vierges ne sont pas codées (RNA), mais sont tout simplement laissés vides. En essayant de charger le fichier tab-delimited cela crée des problèmes pour R qui pense qu'il y a des nombres incorrects de colonnes.

solution de contournement à l'aide des fichiers SAS

j'ai trouvé une solution de contournement en chargeant le fichier SAS en utilisant le sas7bdat emballer puis recoder les cellules Vierges ("") comme 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

il y a deux problèmes avec cette méthode à être conscient de, cependant:

  1. C'est lent (voir les commentaires)
  2. sas7bdat package est actuellement considéré comme expérimental au moment de la rédaction par son auteur. Il se pourrait donc qu'il ne charge pas tous les fichiers sas, et je vérifierais ceux qu'il fait minutieusement pour les incohérences avant l'utilisation.

Non-solution R

Ce n'est pas exactement canonique, mais vous pouvez également téléchargez les fichiers délimités par des tabulations, ouvrez-les dans LibreOffice Calc (Microsoft Excel semble tout gâcher), et trouvez et remplacez tout en cherchant "" et le remplacement par NA.

6
répondu Phil 2017-12-19 07:58:34

à compter du 18 janvier 2018, le havre r la bibliothèque chargera les ensembles de données sas et stata dans L'environnement R. Dans R, tout simplement:

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

Vous pouvez également charger les données manuellement dans R studio. Dans le volet environnement, choisissez

importer ensemble de données > à partir de SAS...

Sélectionner l'emplacement du fichier et cliquez sur "Importer"

4
répondu Anna 2018-05-01 17:47:37