我正在尝试学习R并希望引入一个SPSS文件,我可以在SPSS中打开它。
我尝试使用read.spss
中的foreign
和spss.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
答案 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,保存新副本,您应该开展业务。尴尬,但是自由。
,
答案 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软件能够读取新数据。但不影响数据。我已经使用了很多次,数据也没有丢失。
了解相关信息答案 6 :(得分:2)
如果您有权访问SPSS,请将文件另存为.csv,然后使用read.csv
或read.table
将其导入。我记不起.sav文件导入的任何问题。到目前为止,它与read.spss
和spss.get
的魅力相似。我认为spss.get
不会给出不同的结果,因为它取决于foreign::read.spss
您能提供一些关于SPSS / R / Hmisc /外国版的信息吗?
答案 7 :(得分:2)
此处未提及的另一种解决方案是通过ODBC读取R中的SPSS数据。你需要:
RODBC
包导入SPSS数据
醇>
见the example here。但是我不得不承认,非常大的数据文件可能存在问题。
答案 8 :(得分:1)
您使用的软件包没有此类问题。读取spss文件的唯一要求是将文件放入PORTABLE格式文件中。我的意思是,spss文件有* .sav扩展名。您需要在使用* .por扩展名的可移植文档中转换spss文件。
中有更多信息答案 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)
我刚刚遇到了一个无法使用 haven
、foreign
或 memisc
打开的 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!