将R data.frame导出到SPSS
有一个包将R data.frame导出到SPSS,r,csv,export,spss,R,Csv,Export,Spss,有一个包foreign,它具有一个函数write.foreign(),可以写入SPS和CSV文件。SPS文件可以将CSV文件读入SPSS,包括标签。到目前为止还可以,但该函数存在一些问题: 较新的SPSS版本可能会显示一个错误,即数据列表中的格式定义太少 如果通过attr()存储的数字变量有“标签”,则这些标签将丢失 即使SPSS vesion最多支持32767个字符串,如果任何变量中的字符串超过255个,函数write.foreign()也会停止 如果使用任何字符变量,都会有一个星号(*),但
foreign
,它具有一个函数write.foreign()
,可以写入SPS和CSV文件。SPS文件可以将CSV文件读入SPSS,包括标签。到目前为止还可以,但该函数存在一些问题:
数据列表中的格式定义太少
attr()
存储的数字变量有“标签”,则这些标签将丢失write.foreign()
也会停止Error in if (any(lengths > 255L)) stop("Cannot handle character variables longer than 255") :
missing value where TRUE/FALSE needed
我花了很多时间在这方面,然后找到了一个好的帖子()开始,并使它变得更好。这是我的结果,我想与大家分享。此函数替代了
foreign:write.foreign
来处理上述问题
注意:为避免SPSS查找CSV文件时出现问题,请至少为数据文件指定完整路径(!)
(如果使用原始外部:write.foreign()
)
注意:此脚本将用空白替换字符串中的制表符(制表符)和其他间距(包括CR+LF),而不发出警告。可以考虑使用<代码>获取数据< /代码>而不是麻烦的<代码>数据列表< /代码>来解决这个限制。
注意:在FUN(X[[i]],…)中可能有一个警告:模数可能完全失去准确性
-这是指计算小数,可以忽略
注意:POSIXlt
和POSIXct
变量尚未由脚本正确处理
writeForeignMySPSS = function (df, datafile, codefile, varnames = NULL, len = 32767) {
adQuote <- function (x) paste("\"", x, "\"", sep = "")
# Last variable must not be empty for DATA LIST
if (any(is.na(df[[length(df)]]))) {
df$END_CASE = 0
}
# http://stackoverflow.com/questions/5173692/how-to-return-number-of-decimal-places-in-r
decimalplaces <- function(x) {
y = x[!is.na(x)]
if (length(y) == 0) {
return(0)
}
if (any((y %% 1) != 0)) {
info = strsplit(sub('0+$', '', as.character(y)), ".", fixed=TRUE)
info = info[sapply(info, FUN=length) == 2]
if (length(info) >= 2) {
dec = nchar(unlist(info))[seq(2, length(info), 2)]
} else {
return(0)
}
return(max(dec, na.rm=T))
} else {
return(0)
}
}
dfn <- lapply(df, function(x) if (is.factor(x))
as.numeric(x)
else x)
# Boolean variables (dummy coding)
bv = sapply(dfn, is.logical)
for (v in which(bv)) {
dfn[[v]] = ifelse(dfn[[v]], 1, 0)
}
varlabels <- names(df)
# Use comments where applicable
for (i in 1:length(df)) {
cm = comment(df[[i]])
if (is.character(cm) && (length(cm) > 0)) {
varlabels[i] = comment(df[[i]])
}
}
if (is.null(varnames)) {
varnames <- abbreviate(names(df), 8L)
if (any(sapply(varnames, nchar) > 8L))
stop("I cannot abbreviate the variable names to eight or fewer letters")
if (any(varnames != varlabels))
warning("some variable names were abbreviated")
}
varnames <- gsub("[^[:alnum:]_\\$@#]", "\\.", varnames)
dl.varnames <- varnames
chv = sapply(df, is.character)
if (any(chv)) {
for (v in which(chv)) {
dfn[[v]] = gsub("\\s", " ", dfn[[v]])
}
lengths <- sapply(df[chv], function(v) max(nchar(v), na.rm=T))
if (any(lengths > len)) {
warning(paste("Clipped strings in", names(df[chv]), "to", len, "characters"))
for (v in which(chv)) {
df[[v]] = substr(df[[v]], start=1, stop=len)
}
}
lengths[is.infinite(lengths)] = 0
lengths[lengths < 1] = 1
lengths <- paste("(A", lengths, ")", sep = "")
# star <- ifelse(c(FALSE, diff(which(chv) > 1)), " *",
dl.varnames[chv] <- paste(dl.varnames[chv], lengths)
}
# decimals and bools
nmv = sapply(df, is.numeric)
dbv = sapply(df, is.numeric)
nv = (nmv | dbv)
decimals = sapply(df[nv], FUN=decimalplaces)
dl.varnames[nv] = paste(dl.varnames[nv], " (F", decimals+8, ".", decimals, ")", sep="")
if (length(bv) > 0) {
dl.varnames[bv] = paste(dl.varnames[bv], "(F1.0)")
}
rmv = !(chv | nv | bv)
if (length(rmv) > 0) {
dl.varnames[rmv] = paste(dl.varnames[rmv], "(F8.0)")
}
# Breaks in output
brv = seq(1, length(dl.varnames), 10)
dl.varnames[brv] = paste(dl.varnames[brv], "\n", sep=" ")
cat("SET LOCALE = ENGLISH.\n", file = codefile)
cat("DATA LIST FILE=", adQuote(datafile), " free (TAB)\n", file = codefile, append = TRUE)
cat("/", dl.varnames, " .\n\n", file = codefile, append = TRUE)
cat("VARIABLE LABELS\n", file = codefile, append = TRUE)
cat(paste(varnames, adQuote(varlabels), "\n"), ".\n", file = codefile,
append = TRUE)
factors <- sapply(df, is.factor)
if (any(factors)) {
cat("\nVALUE LABELS\n", file = codefile, append = TRUE)
for (v in which(factors)) {
cat("/\n", file = codefile, append = TRUE)
cat(varnames[v], " \n", file = codefile, append = TRUE)
levs <- levels(df[[v]])
cat(paste(1:length(levs), adQuote(levs), "\n", sep = " "),
file = codefile, append = TRUE)
}
cat(".\n", file = codefile, append = TRUE)
}
# Labels stored in attr()
attribs <- !unlist(lapply(sapply(df, FUN=attr, which="1"), FUN=is.null))
if (any(attribs)) {
cat("\nVALUE LABELS\n", file = codefile, append = TRUE)
for (v in which(attribs)) {
cat("/\n", file = codefile, append = TRUE)
cat(varnames[v], " \n", file = codefile, append = TRUE)
# Check labeled values
tc = list()
for (tcv in dimnames(table(df[[v]]))[[1]]) {
if (!is.null(tcl <- attr(df[[v]], tcv))) {
tc[tcv] = tcl
}
}
cat(paste(names(tc), tc, "\n", sep = " "),
file = codefile, append = TRUE)
}
cat(".\n", file = codefile, append = TRUE)
}
ordinal <- sapply(df, is.ordered)
if (any(ordinal)) {
tmp = varnames[ordinal]
brv = seq(1, length(tmp), 10)
tmp[brv] = paste(tmp[brv], "\n")
cat(paste("\nVARIABLE LEVEL", paste(tmp, collapse=" "), "(ORDINAL).\n"),
file = codefile, append = TRUE)
}
num <- sapply(df, is.numeric)
if (any(num)) {
tmp = varnames[num]
brv = seq(1, length(tmp), 10)
tmp[brv] = paste(tmp[brv], "\n")
cat(paste("\nVARIABLE LEVEL", paste(tmp, collapse=" "), "(SCALE).\n"),
file = codefile, append = TRUE)
}
cat("\nEXECUTE.\n", file = codefile, append = TRUE)
write.table(dfn, file = datafile, row = FALSE, col = FALSE,
sep = "\t", quote = F, na = "", eol = "\n", fileEncoding="UTF-8")
}
writeForeignMySPSS=function(df,数据文件,代码文件,varnames=NULL,len=32767){
adQuoteSPSS扩展命令STATS GET R可以从保存的R工作区将数据帧直接读取到SPSS数据集中。如果尚未安装此扩展命令(它将显示在“文件”菜单上),则可以从“实用程序”菜单(统计信息22-23)或“扩展信息”菜单(统计信息24+)安装.要将R data.frame导出到SPSS,请使用haven软件包中的write_sav
:
library(haven)
write_sav(mtcars, "mtcars.sav")
德国SPSS版本23的路径:Extras->Erweiterungsbundles->Erweiterungsbundles herunterladen und installieren(统计数据获取R)。此外,必须安装“R集成插件”(“R软件包”的一部分)(“R软件包”)需要IBM注册。请注意,SPSS软件包需要特定的R版本(例如,3.1)并将在安装过程中下载多个R软件包(耐心等待)很遗憾,导入后缺少值和变量标签。效果很好!Factors和POSIXct也可以很好地导出。这肯定会节省我很多时间…而且变化很快。我发现我的测试数据集存在一些小缺点:注释不能导出为变量标签,字符串被剪裁为255个字符,如果这里是精确的255个字符的字符串,它有时会创建一个无法在SPSS中打开的SAV文件(至少版本23)。很高兴它有所帮助。如果您有一个可复制的示例来记录这些现象,并且相信它可以修复,您可以在包的上发布一个问题。是的,实际上我花了一些时间跟踪该问题:)在上报告