在我的公司,我们正在考虑逐步淘汰选择R的SPSS。在过渡期间,我们仍将以 SPSS 数据文件格式 (.sav) 提供数据。
我在将此 SPSS 数据文件导入 R 时遇到问题。当我将 SPSS 文件导入 R 时,我希望保留变量的值和值标签。包中的read.spss()
函数foreign
让我可以选择保留变量的值或值标签,但不能同时保留两者。
AFAIK,R确实允许因子变量具有值(水平)和值标签(水平标签)。我只是想知道是否可以以某种方式修改read.spss()
函数以合并它。
或者,我从memisc
包中遇到了spss.system.file()
函数,据说它允许这种情况发生,但它要求一个单独的语法文件 (codes.file),我不一定总是可以使用该文件。
下面是一个示例数据文件。
我将不胜感激任何帮助解决此问题。
谢谢。
如何读取 SPSS 元数据;我通常会读取.csv文件并重新添加元数据,或者编写一个小的一次性 PERL 脚本来完成这项工作。我想提到的是,最近发布的 R 包 Rz 可以帮助您将 SPSS 数据引入 R。我快速浏览了一下,似乎很有用。
解决方案可以通过 ODBC 驱动程序在 R 中读取 SPSS 数据文件。
1) 有一个 IBM SPSS 统计数据文件驱动程序。我找不到下载链接。我从我的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)
}
我的工作正在经历同样的转变。
read.spss() 将变量标签作为使用它创建的对象的属性返回。 所以在下面的例子中,我有一个名为rvm的数据帧,它是由read.spss()创建的,to.data.frame=TRUE。 它有 3,500 个变量,短名称为 a1、a2 等,但 SPSS 中的每个变量都有长标签。 我可以通过以下方式访问变量标签
cbind(attributes(rvm)$variable.labels)
返回所有 3,500 个变量全名的列表,最多
…
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"插件(免费,但你需要注册,也请参阅安装说明),它允许你在SPSS中运行R。该插件包含一个 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
如今,该软件包haven
提供了实现您想要的功能(以及更多)。
函数 read_sav()
可以导入 *.sav 和 *.zsav 文件并返回tibble
。变量标签自动存储在该tibble
中相应变量的labels
属性中。标记的类保留了原始语义,并允许我们将任意标签与数字或字符向量相关联。如果需要,我们可以使用函数 as_factor()
强制标记对象,即标记类的对象,甚至 data.frame
s 或 tibble
s(一次)内的所有标记向量因子。