5

在我的公司,我们正在考虑逐步淘汰 SPSS 以选择 R。在过渡期间,尽管我们仍将获得 SPSS 数据文件格式 (.sav) 的数据。

我在将此 SPSS 数据文件导入 R 时遇到问题。当我将 SPSS 文件导入 R 时,我想保留变量的值和值标签。包中的read.spss()函数foreign使我可以选择保留变量的值或值标签,但不能同时保留两者。

AFAIK,R 确实允许因子变量具有值(级别)和值标签(级别标签)。我只是想知道是否有可能以某种方式修改read.spss()函数来合并它。

或者,我spss.system.file()memisc包中遇到了据称允许这种情况发生的函数,但它要求一个单独的语法文件(codes.file),我不一定总是可以使用它。

这是一个示例数据文件

我将不胜感激解决此问题的任何帮助。

谢谢。

4

5 回答 5

4

我不知道如何读取 SPSS 元数据;我通常读取 .csv 文件并添加元数据,或者编写一个小的一次性 PERL 脚本来完成这项工作。我想提一下的是,最近发布的 R 包Rz可以帮助您将 SPSS 数据引入 R。我已经快速浏览了一下,似乎很有用。

于 2013-01-30T17:15:24.587 回答
2

我的工作正在经历同样的转变。

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 搜索等。

于 2013-01-30T20:29:32.323 回答
2

有一个解决方案可以通过 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)
}
于 2013-02-26T15:19:34.707 回答
1

由于您有 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
于 2013-01-30T19:41:52.333 回答
0

如今,该软件包haven提供了实现您想要的功能(以及更多功能)。

该函数read_sav()可以导入 *.sav 和 *.zsav 文件并返回一个 .sav 文件tibble。变量标签自动存储在labels对应变量的属性中tibble标签类保留了原始语义,并允许我们将任意标签与数字或字符向量相关联。如果需要,我们可以使用该函数as_factor()强制标记对象,即标记类的对象,甚至data.frames 或tibbles 内的所有标记向量(一次)到因子。

于 2020-01-22T22:45:53.700 回答