Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将R data.frame导出到SPSS_R_Csv_Export_Spss - Fatal编程技术网

将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,包括标签。到目前为止还可以,但该函数存在一些问题:

  • 较新的SPSS版本可能会显示一个错误,即
    数据列表中的格式定义太少
  • 如果通过
    attr()
    存储的数字变量有“标签”,则这些标签将丢失
  • 即使SPSS vesion最多支持32767个字符串,如果任何变量中的字符串超过255个,函数
    write.foreign()
    也会停止
  • 如果使用任何字符变量,都会有一个星号(*),但较新的SPSS版本无法处理该问题
  • CSV文件以逗号分隔,不能使用引号,因此字符串(字符)中不允许使用逗号
  • 非ASCII字符(例如umlauts)将使导入崩溃
  • 如果您有一个包含任何NA值的字符,您将看到
  • 。。。如下所示的错误消息:

    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)。很高兴它有所帮助。如果您有一个可复制的示例来记录这些现象,并且相信它可以修复,您可以在包的上发布一个问题。是的,实际上我花了一些时间跟踪该问题:)在上报告