将SPSS文件读入R中

时间:2010-06-28 21:30:18

标签: r spss

我正在尝试学习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:position   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

14 个答案:

答案 0 :(得分:46)

我有一个类似的问题,并在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声明的帮助页面:

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

答案 1 :(得分:18)

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

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

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

答案 2 :(得分:9)

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

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

alt text

答案 3 :(得分:7)

你也可以试试这个:

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)

答案 4 :(得分:5)

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

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

查看是否存在自定义属性

显示属性。

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

HTH, 乔恩佩克

答案 5 :(得分:5)

您可以使用上述解决方案或您当前使用的解决方案从SPSS阅读R个文件。只需确保该命令随文件一起提供,即可正确读取。我有同样的错误,问题是,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

了解相关信息

答案 6 :(得分:2)

如果您有权访问SPSS,请将文件另存为.csv,然后使用read.csvread.table将其导入。我记不起.sav文件导入的任何问题。到目前为止,它与read.spssspss.get的魅力相似。我认为spss.get不会给出不同的结果,因为它取决于foreign::read.spss

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

答案 7 :(得分:2)

此处未提及的另一种解决方案是通过ODBC读取R中的SPSS数据。你需要:

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

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

答案 8 :(得分:1)

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

http://www.statmethods.net/input/importingdata.html

中有更多信息

答案 9 :(得分:1)

在我的情况下,这个警告与我的数据的第一列之前的新变量的外观相结合,其值为-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

希望上面的代码可以帮助别人。

答案 10 :(得分:1)

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

答案 11 :(得分:0)

1)

我发现程序stat-transfer对于将spss和stata文件导入R是很有用的。

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

2)

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

答案 12 :(得分:0)

关闭SPSS中的UNICODE

在没有打开任何数据的情况下打开SPSS并在语法编辑器中运行以下代码

SET UNICODE OFF.

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

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

答案 13 :(得分:0)

我刚刚遇到了一个无法使用 havenforeignmemisc 打开的 SPSS 文件,但是 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!