58

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

我试过使用read.spssfromforeignspss.getfrom 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

4

15 回答 15

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 中完成的。它们也适用于有效加载大型数据集。最重要的是,导入器对象支持此包提供的标签、缺失值和描述。

于 2012-09-14T15:10:01.990 回答
18

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

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

install.packages("memisc")
data <- as.data.set(spss.system.file('yourfile.sav'))
于 2013-09-29T07:11:22.307 回答
10

你也可以试试这个:

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)
于 2016-01-19T13:12:16.887 回答
9

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

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

替代文字,

于 2010-12-11T03:35:11.203 回答
6

您可以使用上述解决方案或您当前使用的解决方案读取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

于 2014-09-21T20:06:27.063 回答
5

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

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

显示属性。

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

HTH,乔恩·派克

于 2010-06-28T23:02:18.267 回答
2

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

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

请参阅此处的示例。但是我不得不承认,非常大的数据文件可能存在问题。

于 2013-03-03T08:42:50.097 回答
2

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

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

于 2010-06-28T23:38:17.697 回答
2

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

install.packages("memisc")
load('memisc')
Daten.Februar <-as.data.set(spss.system.file("NPS_Februar_15_Daten.sav"))
names(Daten.Februar)
于 2015-09-22T10:10:29.467 回答
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')})
于 2018-04-03T17:00:51.457 回答
1

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

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

于 2011-12-28T01:53:51.080 回答
1

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

希望上面的代码对其他人有帮助。

于 2015-01-19T06:58:28.647 回答
1

关闭 SPSS 中的 UNICODE

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

SET UNICODE OFF.

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

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

于 2016-08-15T10:59:28.343 回答
0

1)

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

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

2)

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

于 2010-06-29T00:01:20.420 回答
0

我刚刚遇到一个 SPSS 文件,我无法使用 、 或 来打开它havenforeignmemiscreadspss::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!

于 2021-03-25T21:01:19.640 回答