Ответ 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
- это вариант для вас в конце концов.