2016-10-13 15 views
1

write.foreign()パッケージには、write.foreign()というSPSファイルとCSVファイルを書き込むことができるパッケージforeignがあります。 SPSファイルは、ラベルを含むSPSSにCSVファイルを読み込むことができます。 attr()経由で保存された数値変数のための「ラベル」がある場合は、より新しいRデータフレームをSPSSにエクスポート

  1. SPSSのバージョンは、あなたが
  2. DATA LISTに少なすぎるフォーマット定義を持っているエラーが表示されることがありますファイン今のところ、それの機能を持ついくつかの問題がありますこれらは失われます。
  3. SPSS vesionが最大32767までの文字列をサポートしていても、25535以上の変数があれば、write.foreign()関数は停止します。
  4. 文字変数が使用されている場合は星印(*)が使用されますが、新しいSPSSバージョンではそれを処理できません。
  5. CSVファイルは、カンマ区切りで、引用符を使用しない(でき)ないので何もコンマは、文字列(文字)で許可されていない
  6. 非ASCII caracters(例えばウムラウト)は
  7. 輸入がクラッシュします、あなたは持っているべき任意のNA値が含まれている文字は、あなたが...

を参照してくださいよ...このようなエラーメッセージ:

Error in if (any(lengths > 255L)) stop("Cannot handle character variables longer than 255") : 
    missing value where TRUE/FALSE needed 

は、私はそれで多くの時間を費やし、その後、良いを見つけました転記(http://r.789695.n4.nabble.com/SPSS-export-in-R-package-foreign-td921491.html)を使い始めると良いでしょう。ここに私の結果、私はあなたと共有したいと思います。

答えて

1

この機能は、上記の問題を処理するforeign:write.foreignの代わりです。

注:(!)SPSSは、CSVファイルを見つけることで問題を回避するためには、(また、元foreign:write.foreign()を使用している場合)datafileための少なくとも完全なパスを指定してください。

注:このスクリプトは、文字列のタブ区切り文字(TAB)およびその他のスペース(CR + LFを含む)を、警告なしでブランクに置き換えます。この制限を解決するのに面倒なDATA LISTの代わりにGET DATAを使用することを検討するかもしれません。

注:In FUN(X[[i]], ...) : probable complete loss of accuracy in modulusがある場合があります。これは小数点以下を数えたもので、無視することができます。

注: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:]_\\[email protected]#]", "\\.", 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") 
} 

、変更がforeignパッケージにマージされると考えることがあります。残念ながら、rプロジェクトのバグ報告システムは、現在、以前登録された開発者に限られています。

1

SPSS拡張コマンドSTATS GET Rは、保存されたRワークスペースからSPSSデータセットにデータフレームを直接読み込むことができます。この拡張コマンドがまだインストールされていない場合(ファイルメニューに表示されます)、Utilitiesメニュー(Statistics 22-23)またはExtensionsメニュー(Statistics 24+)からインストールできます。

+0

パスをドイツSPSSバージョン23用:エクストラ - > Erweiterungsbundles - > Erweiterungsbundlesダウンロードウントinstallieren(STATSはRをGET)。さらに、「Rの統合プラグイン」(「Essentials for R」の一部)をインストールする必要があります(http://www.ibm.com/support/knowledgecenter/de/SSLVMB_22.0.0/com.ibm.spss .statistics.help/spss/base/faq_plugins.htm - IBM登録が必要です)。 SPSSの必須機能は特定のRバージョン(例えば3.1)を必要とし、インストール中に複数のRパッケージをダウンロードする(患者であることに注意)。残念ながら、インポート後に値と変数のラベルが欠落していました。 – BurninLeo

3

Rデータをエクスポートする。SPSSのフレームには、避難所のパッケージからwrite_savを使用します。

library(haven) 
write_sav(mtcars, "mtcars.sav") 
+0

作品は魅力的です!因子とPOSIXctも正しくエクスポートされます。これは間違いなく私に多くの時間を節約しました...そしてそれは速く変化します。コメントは変数ラベルとしてエクスポートされず、文字列は255文字にクリップされ、255文字の文字列があると、SPSSで開かないSAVファイルが作成されることがあります。少なくともバージョン23)。 – BurninLeo

+0

喜んで助けました。現象を文書化する再現可能な例があり、それが修正できると思われる場合は、パッケージの[GitHubリポジトリ](https://github.com/tidyverse/haven/issues)に問題を投稿することができます。 –

+1

はい、実際に私は問題を追跡するためにいくつかの時間を費やしました:) https://github.com/tidyverse/haven/issues/226で報告されました – BurninLeo

関連する問題