Подтвердить что ты не робот

Чтение данных SAS sas7bdat в R

Какие параметры имеют R для чтения файлов в собственном формате SAS, sas7bdat, в R?

NCES Common Core, например, содержит обширный репозиторий файлов данных, сохраненных в этом формате. Для конкретности позвольте сосредоточиться на попытке прочитать в этот файл из Вселенной LEA в 1997-1998 годах, который содержит демографические данные уровня образования на уровне организаций для все состояния, начинающиеся от A до I.

Здесь предварительный просмотр из SAS данных:

sas_preview

Какой самый простой способ донести эти данные до моей среды R? У меня нет какой-либо версии SAS и я не хочу платить, поэтому просто преобразовать ее в .csv было бы сложно.

4b9b3361

Ответ 1

sas7bdat работал отлично для всех, кроме одного из файлов, на которые я смотрел (в частности, этот); сообщая об ошибке разработчику sas7bdat, Мэтью Шотвелл, он также указал мне в сторону пакета Hadley haven в R, который также имеет метод read_sas.

Этот метод превосходит по двум причинам:

1) У него не было проблем с чтением связанного файла 2) Это намного (я говорю намного) быстрее, чем read.sas7bdat. Здесь приведен быстрый тест (на этот файл, который меньше других) для доказательства:

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 занимает (в среднем) на 99,5% меньше времени, чем sas7bdat::read.sas7bdat.

незначительное обновление

Я ранее не смог выяснить, дали ли два метода одни и те же данные (т.е. оба имеют равные уровни точности по отношению к чтению данных), но, наконец, сделали это:

# 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

Однако обратите внимание, что read.sas7bdat сохранил массивный список атрибутов для файла, предположительно, перехват 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
# ...

Итак, если вам вообще нужны эти атрибуты (я знаю, что некоторые люди особенно заинтересованы в label s, например), возможно, read.sas7bdat - это вариант для вас в конце концов.

Ответ 2

Проблема

Проблема выглядит так: файлы, которые вы пытаетесь использовать, плохо отформатированы. В частности, пустые ячейки не кодируются (R использует NA), но просто оставлены пустыми. При попытке загрузить файл с разделителями табуляции это создает проблемы для R, который считает, что есть некорректные числа столбцов.

Обходной путь с использованием файлов SAS

Я нашел обходной путь, загрузив файл SAS с помощью пакета sas7bdat и затем перебирая пустые ячейки ("") как 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

В этом методе есть две проблемы:

  • Он медленный (см. комментарии) Пакет
  • sas7bdat в настоящее время считается экспериментальным на момент написания его автором. Поэтому он может не загружать все файлы sas, и я должен проверить те, которые он делает полностью для несоответствий перед использованием.

Решение Non-R

Это не совсем канонически, но вы также можете скачать файлы с разделителями табуляции, открыть их в LibreOffice Calc (Microsoft Excel, похоже, все испортит), и найти и заменить все путем поиска "" и замены NA.