【问题标题】:Read SPSS file into R将 SPSS 文件读入 R
【发布时间】:2011-03-09 08:31:42
【问题描述】:

我正在尝试学习 R 并想引入一个 SPSS 文件,我可以在 SPSS 中打开该文件。

我尝试使用来自foreignread.spss 和来自Hmiscspss.get。两个错误消息是相同的。

这是我的代码:

## install.packages("Hmisc")
library(foreign)

## change the working directory
getwd()
setwd('C:/Documents and Settings/BTIBERT/Desktop/')

## load in the file
## ?read.spss
asq <- read.spss('ASQ2010.sav', to.data.frame=T)

以及由此产生的错误:

read.spss("ASQ2010.sav", to.data.frame = T) 中的错误:错误 读取系统文件头另外:警告消息:在 read.spss("ASQ2010.sav", to.data.frame = T) : ASQ2010.sav: 位置 0: 字符 `\000' (

另外,我尝试将 SPSS 文件另存为 SPSS 7 .sav 文件(之前使用的是 SPSS 18)。

警告消息:1:在 read.spss("ASQ2010_test.sav", to.data.frame = T) : ASQ2010_test.sav: 无法识别的记录类型 7,子类型 14 在系统文件 2 中遇到:在 read.spss("ASQ2010_test.sav", to.data.frame = T) : ASQ2010_test.sav: 无法识别的记录类型 7, 系统文件中遇到子类型 18

【问题讨论】:

  • 关于最后的努力:这只是一个警告,而不是一个错误,所以你应该得到有用的结果。

标签: r spss


【解决方案1】:

我刚遇到一个 SPSS 文件,我无法使用 havenforeignmemisc 打开它,但 readspss::read.por 为我解决了问题:

download.file("http://www.tcd.ie/Political_Science/elections/IMSgeneral92.zip",
              "IMSgeneral92.zip")

unzip("IMSgeneral92.zip", exdir = "IMSgeneral92")

# rio, haven, foreign, memisc pkgs don't work on this file! But readspss does:
if(!require(readspss)) remotes::install_git("https://github.com/JanMarvin/readspss.git")
ims92 <- readspss::read.por("IMSgeneral92/IMS_Nov7 92.por", convert.factors = FALSE)

不错!谢谢@JanMarvin!

【讨论】:

    【解决方案2】:

    我同意@SDahm 的观点,即haven 包将是可行的方法。我自己在开始使用字符串值时遇到了一些困难,所以我想我也会在这里分享我的方法。

    “语义”小插曲有一些关于这个主题的有用信息。

    library(tidyverse)
    library(haven)
    
    # Some interesting information in here
    vignette('semantics')
    
    # Get data from spss file
    df <- read_sav(path_to_file)
    
    # get value labels
    df <- map_df(.x = df, .f = function(x) {
      if (class(x) == 'labelled') as_factor(x)
      else x})
    # get column names
    colnames(df) <- map(.x = spss_file, .f = function(x) {attr(x, 'label')})
    

    【讨论】:

    • 我真的很喜欢 @JanLauGe 获取分类变量级别标签的方法,但为了让我的工作我不得不将 "labelled" 更改为 "haven_labelled"as_factor 到 @ 987654326@。另外,对于分配列名,spss_file 在您的代码中指的是什么?
    【解决方案3】:

    关闭 SPSS 中的 UNICODE

    在不打开任何数据的情况下打开 SPSS,然后在语法编辑器中运行以下代码

    SET UNICODE OFF.
    

    打开数据集并重新保存以删除 Unicode

    read.spss('yourdata.sav', to.data.frame=T) 然后正常工作

    【讨论】:

      【解决方案4】:

      你也可以试试这个:

      setwd("C:/Users/rest of your path")
      
      library(haven)
      data <- read_sav("data.sav")
      

      如果你想从一个文件夹中读取所有文件:

      temp <- list.files(pattern = "*.sav")
      read.all <- sapply(temp, read_sav)
      

      【讨论】:

        【解决方案5】:

        对我来说,使用 memisc 效果很好!

        install.packages("memisc")
        load('memisc')
        Daten.Februar <-as.data.set(spss.system.file("NPS_Februar_15_Daten.sav"))
        names(Daten.Februar)
        

        【讨论】:

          【解决方案6】:

          read.spss 似乎有点过时了,所以我使用了名为 memisc 的包。

          要使其正常工作,请执行以下操作:

          install.packages("memisc")
          data <- as.data.set(spss.system.file('yourfile.sav'))
          

          【讨论】:

          • 我对data.frames比较熟悉,所以我用data &lt;- data.frame(as.data.set(spss.system.file('yourfile.sav')))包装了它
          【解决方案7】:

          您可以使用上述解决方案或您当前使用的解决方案从R 读取SPSS 文件。只要确保命令与文件一起提供,它可以正确读取。我有同样的错误,问题是,SPSS 无法访问该文件。您应确保文件路径正确、文件可访问且格式正确。

          library(foreign)
          asq <- read.spss('ASQ2010.sav', to.data.frame=TRUE)
          

          警告信息而言,不影响数据。记录类型 7 用于在较新的 SPSS 软件中存储特征,以使较旧的 SPSS 软件能够读取新数据。但不影响数据。我用了很多次,数据没有丢失。

          您也可以在http://r.789695.n4.nabble.com/read-spss-warning-message-Unrecognized-record-type-7-subtype-18-encountered-in-system-file-td3000775.html#a3007945阅读有关此内容的信息

          【讨论】:

            【解决方案8】:

            在我的情况下,此警告与在我的数据的第一列之前出现的新变量相结合,值为 -100、2、2、2、...、标签和值之间的对应关系发生变化以及删除最后一个变量。一个有效的解决方案是(使用 SPSS)在文件的最后一列中创建一个新的转储变量,用随机值填充它并执行以下代码: (文件名是 sav 文件的路径,在我的例子中,原始 SPSS 文件有 62 列,因此有 63 列带有附加的哑变量)

            library(memisc)
            data <- as.data.set(spss.system.file(filename))
            
            copyofdata = data
            for(i in 2:63){
              names(data)[i] <- names(copyofdata)[i-1]
            }
            data[[1]] <- NULL
            
            newcopyofdata = data
            for(i in 2:62){
              labels(data[[i]]) <- labels(newcopyofdata[[i-1]])
            }
            labels(data[[1]]) <- NULL
            

            希望以上代码对其他人有所帮助。

            【讨论】:

              【解决方案9】:

              这里没有提到的另一个解决方案是通过 ODBC 读取 R 中的 SPSS 数据。你需要:

              1. IBM SPSS Statistics Data File Driver。独立驱动就足够了。
              2. 使用 R 中的 RODBC 包导入 SPSS 数据。

              the example here。但是我不得不承认,非常大的数据文件可能会出现问题。

              【讨论】:

                【解决方案10】:

                我遇到了类似的问题,并按照read.spss 帮助中的提示解决了它。 使用包 memisc 代替,您可以像这样导入 便携式 SPSS 文件:

                data <- as.data.set(spss.portable.file("filename.por"))
                

                同样,对于 .sav 文件:

                data <- as.data.set(spss.system.file('filename.sav'))
                

                虽然在这种情况下我似乎遗漏了一些字符串值,但可移植导入可以无缝工作。 spss.portable.file 声明的帮助页面:

                importer 机制比“foreign”包的 read.spss 和 read.dta 更灵活和可扩展,因为文件头的大部分解析是在 R 中完成的。它们也适用于高效加载大型数据集。最重要的是,导入器对象支持此包提供的标签、缺失值和描述。

                【讨论】:

                • 是否有类似于convert.factors = FALSEuse.value.labels = FALSE 的内容可用于此?
                • “我遇到了类似的问题,并按照 read.spss 帮助中的提示解决了”:read.spss 中帮助您解决问题的提示是什么?
                • @Prabhu 在“另请参阅”部分中对此进行了说明:包memisc 中提供了同样基于PSPP 代码库的不同界面:请参阅spss.system.file 的帮助。
                【解决方案11】:

                您使用的软件包没有这样的问题。读取 spss 文件的唯一要求是将文件放入 PORTABLE 格式文件。我的意思是,spss 文件具有 *.sav 扩展名。您需要将您的 spss 文件转换为使用 *.por 扩展名的可移植文档。

                http://www.statmethods.net/input/importingdata.html有更多信息

                【讨论】:

                  【解决方案12】:

                  我知道这篇文章已经过时了,但我在将 Qualtrics SPSS 文件加载到 R 时也遇到了问题。R 的 read.spss 代码很久以前来自 PSPP,并且有一段时间没有更新了。 (而且 Hmisc 的代码也使用了 read.spss(),所以没有运气。)

                  好消息是 PSPP 0.6.1 应该可以很好地读取文件,只要您在 Qualtrics 的“下载数据”页面上指定“短 - 255(SPSS 12.0 及更早版本)”的“字符串宽度”。将其读入 PSPP,保存一份新副本,您就应该开始工作了。尴尬,但免费。

                  ,

                  【讨论】:

                  【解决方案13】:

                  1)

                  我找到了 stat-transfer 程序,它对于将 spss 和 stata 文件导入 R 很有用。

                  它通过将 spss 转换为 R 数据集解决了您提到的问题。对于将超大型数据集细分为 R 可使用的较小部分也非常有用。不是免费的,但对于处理来自不同程序的数据集非常有用,尤其是在您无权访问它们的情况下。

                  2)

                  Memisc 包还有一个spss 功能值得一试。

                  【讨论】:

                    【解决方案14】:

                    如果您可以访问 SPSS,请将文件另存为 .csv,然后使用 read.csvread.table 将其导入。我不记得 .sav 文件导入有任何问题。到目前为止,它对read.spssspss.get 都非常有效。我认为spss.get 不会给出不同的结果,因为它取决于foreign::read.spss

                    你能提供一些关于 SPSS/R/Hmisc/foreign 版本的信息吗?

                    【讨论】:

                    • 2.10.1 - 更新了所有软件包。我正在从另一个软件获取 SPSS 文件。
                    • 哪一个,如果我们可以知道的话?我对“本身”的特定 SPSS 版本不感兴趣,我只需要知道它是 SPSS 还是 PASW 文件......也许它与最新版本所做的更改有关......不知道...... =(跨度>
                    • PASW - 从测量软件 Qualtrics 创建并在 PASW 18 中修改/保存
                    • 尝试将文件保存在 SPSS 兼容版本中...如果适用。然后用read.spss 导入它。顺便说一句,您始终可以将其导出为纯文本 (ASCII) 文件。
                    • R 中似乎不支持 PASW 文件......你并不孤单:mail-archive.com/r-sig-mac@stat.math.ethz.ch/msg04648.html
                    【解决方案15】:

                    看起来 R read.spss 实现不完整或损坏。然而,R2.10.1 比 R2.8.1 做得更好。即使使用 2.10.1(我拥有的最新版本),R 似乎也会对 sav 文件中的自定义属性感到不安。 R 也可能不理解文件中的字符编码字段,特别是它可能不适用于 SPSS Unicode 文件。

                    您可以尝试在 SPSS 中打开文件,删除所有自定义属性,然后重新保存文件。 可以用SPSS命令查看是否有自定义属性

                    显示属性。

                    如果是这样,请删除它们(请参阅 VARIABLE ATTRIBUTE 和 DATAFILE ATTRIBUTE 命令),然后重试。

                    HTH, 乔恩·派克

                    【讨论】:

                    • 使用的显示属性。在语法文件中,我收到一条警告,告诉我没有要显示的属性。一些字符串字段的长度为 2000,这有关系吗?
                    • 嗨 Jon - 我尝试使用以下语法删除属性。有一些,删除它们,仍然没有运气 *//// 显示自定义属性。显示属性。 *//// 删除所有具有自定义属性的变量。 VARIABLE ATTRIBUTE VARIABLES=GameID TO OUTCOME_DIFF DELETE=$ODBC.Name。 VARIABLE ATTRIBUTE VARIABLES=GameID TO OUTCOME_DIFF DELETE=$ODBC.Table。 VARIABLE ATTRIBUTE VARIABLES=GameID 到 OUTCOME_DIFF DELETE=$ODBC.Size。 VARIABLE ATTRIBUTE VARIABLES=GameID 到 OUTCOME_DIFF DELETE=$ODBC.Type。 *//// 确认它们已被删除并手动保存。显示属性。
                    猜你喜欢
                    • 1970-01-01
                    • 2013-01-14
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-09-23
                    • 2017-05-25
                    • 2023-04-08
                    • 2013-05-19
                    • 1970-01-01
                    相关资源
                    最近更新 更多