首页 文章

将SPSS数据文件导入R

提问于
浏览
5

在我的公司,我们正在考虑在选择R时逐步淘汰SPSS . 在过渡期间,我们仍将使用SPSS数据文件格式(.sav) .

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

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

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

这是sample data file .

我很感激任何帮助解决这个问题 .

谢谢 .

4 回答

  • 2

    有一种解决方案可以通过ODBC驱动程序读取R中的SPSS数据文件 .

    1)有IBM SPSS Statistics Data File Driver . 我找不到下载链接 . 我是从我的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
    

    Additional information

    这是一个允许在与SPSS数据文件 Build 连接后读取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)
    }
    
  • 4

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

  • 1

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

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

  • 2

    由于您有SPSS可用,我建议安装"Essentials for R"插件(免费,但您需要注册,也请参阅installation instructions),它允许您在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插件链接的Essentials(显然打破了markdown链接语法):

    https://www.ibm.com/developerworks/mydeveloperworks/wikis/home/wiki/We70df3195ec8_4f95_9773_42e448fa9029/page/Downloads%20for%20IBM®%20SPSS®%20Statistics?lang=en
    

相关问题