чтение файла SPSS в R ошибка выброса - ошибка чтения заголовка системного файла

В последнее время я иногда получаю ошибку при чтении файлов SPSS с использованием read.spss из пакета foreign:

Ошибка в read.spss ("sample.sav"): ошибка чтения заголовка системного файла. Дополнительно: предупреждающее сообщение: в read.spss ("sample.sav"): sample.sav: неверный байт спецификатора формата (0)

Я создал крошечный sample.sav файл с одной переменной и тремя случаями, которые вызовут ошибку. Загрузите файл или используйте

download.file("http://134.102.100.220/~mark/sample.sav", "sample.sav")
read.spss("sample.sav")

Любые идеи?

Моя система

R version 3.1.1 (2014-07-10)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
foreign: Version 0.8-63

locale:
[1] en_US.UTF-8/de_DE.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

person Mark Heckmann    schedule 24.03.2015    source источник
comment
Просто выбросил его там, но пробовали ли вы использовать пакет haven в качестве альтернативы?   -  person JasonAizkalns    schedule 24.03.2015
comment
@JasonAizkalns haven::read_sav("sample.sav") тоже не работает   -  person Mark Heckmann    schedule 24.03.2015
comment
Я попробовал как пакет hawn, так и read_spss из sjmisc (бывший sjPlot-tool functions), и с обоими пакетами я смог прочитать ваш образец файла без ошибок или предупреждений.   -  person Daniel    schedule 26.03.2015
comment
@ DanielLüdecke. да. Я был неправ. read_spss выполняет свою работу (см. Также мой комментарий в haven ответе).   -  person Mark Heckmann    schedule 26.03.2015


Ответы (2)


$FL2@(#) IBM SPSS STATISTICS DATA FILE 64-bit Macintosh 20.0.0 ����������������������Y@24 Mar 1515:00:55electric paper �������������������VAR1 ���None�������������������������������–�����������È˝��������������ˇˇˇˇˇˇÔˇˇˇˇˇˇˇÔ˛ˇˇˇˇˇÔˇ���

Это заголовок, просматриваемый в простом текстовом редакторе (TextEdit.app). Итак, читая файл справки для read.spss, можно увидеть, что он предлагает использовать:

install.packages("memisc")

?memisc::spss.system.file
 memisc::spss.system.file("~/Downloads/sample.sav")
#-=----------------
SPSS system file '/Users/davidwinsemius/Downloads/sample.sav' 
    with 1 variables and 3 observations
 inp <- memisc::spss.system.file("~/Downloads/sample.sav")

 actual <- memisc::subset(inp, select= c(var1=var1))
 actual

Data set with 3 observations and 1 variables

  var1
1    1
2    2
3    3

Мораль истории: иногда лучше прочитать весь файл справки. Поскольку в прошлом я читал ту же страницу справки, я был удивлен, обнаружив, что она была изменена. В прошлом были комментарии относительно ограничений версии, которые теперь, кажется, были сняты.

person IRTFM    schedule 24.03.2015
comment
Дэвид, я довольно давно пытался RTM, но не могу понять, что такое memisc эквивалент для use.value.labels = FALSE в foreign::read.spss, когда моя цель - получить фрейм данных. Вы можете помочь? - person Mark Heckmann; 25.03.2015
comment
Возвращается объект S4. Слот .Data в объекте класса data.set содержит значения, а также атрибуты row_names и names. Кажется, что as.data.frame удалось вернуть обычный фрейм данных в небольшом тестовом примере, который вы предоставили. Поскольку я не вижу ярлыков значений, я не уверен, с какими проблемами вы можете столкнуться. - person IRTFM; 25.03.2015
comment
Вы правы, комментарий был общим вопросом ... Я добавляю метки значений в новый файл sample_labels.sav. Выполнение кода: download.file("http://134.102.100.220/~mark/sample_labels.sav", "sample_labels.sav"); x <- spss.system.file("sample_labels.sav"); xx <- as.data.set(x); as.data.frame(xx); Я получаю фрейм данных, который содержит метки значений, а не исходные значения. Я бы хотел получить исходные значения ... - person Mark Heckmann; 25.03.2015

Я бы использовал пакет haven, а не foreign, для чтения файлов spss:

require("haven")
sample <- read_spss("sample.sav")
View(sample)

В качестве альтернативы вы можете использовать пакет sjPlot, который использует haven для выполнения своей тяжелой работы:

require("sjPlot")
sample <- sjPlot::read_spss("sample.sav", option = "haven")
View(sample)

Используя sjPlot, вы также можете просматривать метки и значения переменных:

sjPlot::view_spss(sample)
person Phil    schedule 24.03.2015
comment
Обновление старого вопроса - read_spss больше не в sjPlots, а в sjlabelled - person DJV; 08.08.2019