Получение файла данных SPSS в R
В моей компании мы думаем о постепенном отказе от SPSS в выборе R. Во время перехода у нас все еще будут данные, поступающие в формате файла данных SPSS (.sav).
У меня проблемы с импортом этого файла данных SPSS в R. Когда я импортирую файл SPSS в R, я хочу сохранить значения и метки значений для переменных. read.spss()
функция от foreign
Пакет дает мне возможность сохранить либо значения, либо значения метки переменной, но не оба.
AFAIK, R позволяет факторным переменным иметь значения (уровни) и метки значений (метки уровня). Мне просто интересно, можно ли как-то изменить read.spss()
функция, чтобы включить это.
Или я наткнулся spss.system.file()
функция от memisc
пакет, который предположительно позволяет этому произойти, но он запрашивает отдельный файл синтаксиса (code.file), который не всегда доступен для меня всегда.
Вот пример файла данных.
Буду признателен за любую помощь в решении этой проблемы.
Благодарю.
4 ответа
Существует решение для чтения файла данных SPSS в R драйвером ODBC.
1) Существует драйвер файла статистических данных IBM SPSS. Я не смог найти ссылку для скачивания. Я получил это от моего провайдера SPSS. Автономный драйвер - это все, что вам нужно. Вам не нужно SPSS для установки или использования драйвера.
2) Создайте DSN для драйвера данных SPSS.
3) Использование RODBC
Пакет вы можете прочитать в R любой файл данных SPSS. Можно будет получить метки значений для каждой переменной в виде отдельных таблиц. Тогда можно использовать метки в R любым удобным для вас способом.
Вот рабочий пример для Windows (у меня сейчас нет SPSS на моем компьютере) для чтения в R вашего файла данных примера. Я не проверял это на Linux. Вероятно, это работает и в Linux, потому что есть драйвер данных SPSS и для Linux.
require(RODBC)
# Create connection
# Change the DSN name and CP_CONNECT_STRING according to your setting
con <- odbcDriverConnect("DSN=spss_ehsis;SDSN=SAVDB;HST=C:\\Program Files\\IBM\\SPSS\\StatisticsDataFileDriver\\20\\Standalone\\cfg\\oadm.ini;PRT=StatisticsSAVDriverStandalone;CP_CONNECT_STRING=C:\\temp\\data_expt.sav")
# List of tables
Tables <- sqlTables(con)
Tables
# List of table names to extract
table.names <- Tables$TABLE_NAME[Tables$TABLE_SCHEM != "SYSTEM"]
# Function to query a table by name
sqlQuery.tab.name <- function(table) {
sqlQuery(con, paste0("SELECT * FROM [", table, "]"))
}
# Retrieve all tables
Data <- lapply(table.names, sqlQuery.tab.name)
# See the data
lapply(Data, head)
# Close connection
close(con)
Например, мы можем, чтобы метки значений были определены для двух переменных:
[[5]]
VAR00002 VAR00002_label
1 1 Male
2 2 Female
[[6]]
VAR00003 VAR00003_label
1 2 Student
2 3 Employed
3 4 Unemployed
Дополнительная информация
Вот функция, которая позволяет считывать данные SPSS после того, как было установлено соединение с файлом данных SPSS. Функция позволяет указать список переменных для выбора. Если value.labels=T
выбранные переменные с метками значений в файле данных SPSS преобразуются в коэффициенты R. с прикрепленными метками.
Я должен сказать, что я не удовлетворен работой этого решения. Это хорошо работает для небольших файлов данных. Предел оперативной памяти достигается довольно часто для больших файлов данных SPSS (даже выбрано подмножество переменных).
get.spss <- function(channel, variables = NULL, value.labels = F) {
VarNames <- sqlQuery(channel = channel,
query = "SELECT VarName FROM [Variables]", as.is = T)$VarName
if (is.null(variables)) variables <- VarNames else {
if (any(!variables %in% VarNames)) stop("Wrong variable names")
}
if (value.labels) {
ValueLabelTableName <- sqlQuery(channel = channel,
query = "SELECT VarName FROM [Variables]
WHERE ValueLabelTableName is not null",
as.is = T)$VarName
ValueLabelTableName <- intersect(variables, ValueLabelTableName)
}
variables <- paste(variables, collapse = ", ")
data <- sqlQuery(channel = channel,
query = paste("SELECT", variables, "FROM [Cases]"),
as.is = T)
if (value.labels) {
for (var in ValueLabelTableName) {
VL <- sqlQuery(channel = channel,
query = paste0("SELECT * FROM [VLVAR", var,"]"),
as.is = T)
data[, var] <- factor(data[, var], levels = VL[, 1], labels = VL[, 2])
}
}
return(data)
}
Я не знаю, как читать в метаданных SPSS; Я обычно читаю файлы.csv и добавляю метаданные обратно, или пишу небольшой одноразовый скрипт на PERL для выполнения этой работы. Я хотел бы упомянуть, что недавно опубликованный пакет R, Rz, может помочь вам перенести данные SPSS в R. Я быстро взглянул на это и кажется полезным.
Моя работа переживает тот же переход.
read.spss() возвращает метки переменных как атрибут объекта, который вы создаете с его помощью. Итак, в приведенном ниже примере у меня есть фрейм данных с именем rvm, который был создан read.spss() с to.data.frame=TRUE. Он содержит 3500 переменных с короткими именами a1, a2 и т. Д., Но с длинными метками для каждой переменной в SPSS. Я могу получить доступ к меткам переменных
cbind(attributes(rvm)$variable.labels)
который возвращает список всех 3500 переменных с полными именами до
…
x23 "Other Expenditure Uncapped Daily Expenditure In Region"
x24 "Accommodation Expenditure In Region"
x25 "Food/Meals/Drink Expenditure In Region"
x26 "Local Transport Expenditure In Region"
x27 "Sightseeing/Attractions Expenditure In Region"
x28 "Event/Conference Expenditure In Region"
x29 "Gambling/Casino Expenditure In Region"
x30 "Gifts/Souvenirs Expenditure In Region"
x31 "Other Shopping Expenditure In Region"
x0 "Accommodation Daily Expenditure In Region"
Что с этим делать - другое дело, но, по крайней мере, они у меня есть, и, если я захочу, я могу поместить их в какой-то другой объект для хранения, поиска с помощью grep и т. Д.
Поскольку у вас есть SPSS, я рекомендую установить плагин "Essentials for R" (бесплатно, но вам нужно зарегистрироваться, см. Также инструкции по установке), который позволяет вам запускать R в SPSS. Плагин включает в себя пакет R с функциями, которые передают активный фрейм данных SPSS в R (и обратно) - включая отмеченные уровни факторов, даты, умлауты Германии - детали, которые в противном случае общеизвестно сложны. По моему опыту, это более надежно, чем собственный R foreign
пакет.
Как только вы все настроите, откройте данные в SPSS и запустите что-то вроде следующего кода в окне синтаксиса:
begin program r.
myDf <- spssdata.GetDataFromSPSS(missingValueToNA=TRUE,
factorMode="labels",
rDate="POSIXct")
save(myDf, file="d:/path/to/your/myDf.Rdata")
end program.
Основы для ссылки на плагин R (очевидно, нарушает синтаксис ссылки уценки):
https://www.ibm.com/developerworks/mydeveloperworks/wikis/home/wiki/We70df3195ec8_4f95_9773_42e448fa9029/page/Downloads%20for%20IBM®%20SPSS®%20Statistics?lang=en
Nowadays, the package haven
provides the functionality to achieve what you want (and much more).
The function read_sav()
can import *.sav and *.zsav files and returns a tibble
. The variable labels are automatically stored in the labels
attribute of the corresponding variables within that tibble
. The class labelled preserves the original semantics and allows us to associate arbitrary labels with numeric or character vectors. If needed, we can use the function as_factor()
to coerce labeled objects, i.e. objects of the class labelled, and even all labeled vectors within data.frame
s or tibble
s (at once) to factors.