有一个解决方案可以通过 ODBC 驱动程序读取 R 中的 SPSS 数据文件。
1) 有一个IBM SPSS Statistics 数据文件驱动程序。我找不到下载链接。我是从我的 SPSS 提供商那里得到的。独立驱动程序就是您所需要的。您不需要 SPSS 来安装或使用驱动程序。
2) 为 SPSS 数据驱动程序创建一个 DSN。
3)使用RODBC
包,您可以在 R 中读取任何 SPSS 数据文件。可以将每个变量的值标签作为单独的表获取。然后可以根据需要以任何方式使用 R 中的标签。
这是 Windows 上的一个工作示例(我的计算机上现在没有 SPSS),用于读取 R 示例数据文件。我没有在 Linux 上测试过这个。它可能也适用于 Linux,因为 Linux 也有一个 SPSS 数据驱动程序。
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 数据文件(甚至选择了变量的子集),经常会达到 RAM 限制。
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)
}