首页 文章

将SPSS文件读入R中

提问于
浏览
52

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

我尝试使用 read.spss 来自 foreignspss.get 来自 Hmisc . 两条错误消息都是相同的 .

这是我的代码:

## 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:系统文件2中遇到无法识别的记录类型7,子类型14:在read.spss中(“ASQ2010_test” .sav“,to.data.frame = T):ASQ2010_test.sav:系统文件中遇到无法识别的记录类型7,子类型18

14 回答

  • 2

    我有一个类似的问题,并在 read.spss 帮助中提示后解决了这个问题 . 使用包 memisc ,您可以导入 portable SPSS文件,如下所示:

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

    同样,对于.sav文件:

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

    虽然在这种情况下我似乎错过了一些字符串值,而便携式导入无缝地工作 . spss.portable.file 的帮助页面声称:

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

  • 1

    如果您有权访问SPSS,请将文件另存为.csv,因此请使用 read.csvread.table 进行导入 . 我记不起.sav文件导入的任何问题 . 到目前为止,它的工作方式与 read.spssspss.get 一样 . 我估计 spss.get 不会给出不同的结果,因为它取决于 foreign::read.spss

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

  • 44

    看起来R read.spss实现不完整或已损坏 . 但是,R2.10.1比R2.8.1更好 . 看起来R对sav文件中的自定义属性感到不满,即使是2.10.1(我最新的) . R也可能无法理解文件中的字符编码字段,特别是它可能不适用于SPSS Unicode文件 .

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

    显示属性 .

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

    HTH,Jon Peck

  • 0

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

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

    warning message 而言,它不会影响数据 . 记录类型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阅读此内容 .

  • 2

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

    the example here . 但是我必须承认,非常大的数据文件可能存在问题 .

  • 18

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

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

  • 0

    1)

    我发现程序,stat-transfer,对于将spss和stata文件导入R非常有用 .

    它通过将spss转换为R数据集来解决您提到的问题 . 对于将超大型数据集子集化为R所消耗的较小部分也非常有用 . 不是免费的,但是用于处理来自不同程序的数据集的非常有用的工具 - 特别是如果您无法访问它们 .

    2)

    Memisc包也有一个值得尝试的spss功能 .

  • 5

    read.spss 似乎已经过时了,所以我使用了名为 memisc 的包 .

    要实现这一点,请执行以下操作:

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

    你也可以试试这个:

    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

    关闭SPSS中的UNICODE

    打开SPSS,不打开任何数据,并在语法编辑器中运行下面的代码

    SET UNICODE OFF.
    

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

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

  • 9

    对我来说,使用memisc很好!

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

    在我的情况下,此警告首先与新变量的外观相结合我的数据列的值为-100,2,2,2,...,标签和值之间的对应关系的移位以及最后一个变量的删除 . 一个有效的解决方案是(使用SPSS)在文件的最后一列中创建一个新的转储变量,用随机值填充它并执行以下代码:(filename是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
    

    希望上面的代码能帮助别人 .

  • 1

    我知道这篇文章很老,但我也遇到了将Qualtrics SPSS文件加载到R中的问题.R的read.spss代码很久以前来自PSPP,并且暂时没有更新 . (而且Hmisc的代码也使用read.spss(),所以那里没有运气 . )

    好消息是PSPP 0.6.1应该可以正确读取文件,只要在Qualtrics中的“下载数据”页面上指定“短 - 255(SPSS 12.0及更早版本)”的“字符串宽度”即可 . 将其读入PSPP,保存新副本,您应该开展业务 . 尴尬,但免费 .

    alt text

  • 7

    我同意@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')})
    

相关问题