[Rd] SPSS export in R package foreign

From: <svga_at_arcor.de>
Date: Tue, 07 Oct 2008 14:53:41 +0200 (CEST)


Hi there,

I found that ordered factors are exported as nominal variables in writeForeignSPSS (foreign package version 0.8-29), e.g:

   datafile<-tempfile()
   codefile<-tempfile()
   dat <- data.frame(ID=factor(letters[1:3]), x=1:3,

                     f=factor(LETTERS[1:3], ordered=TRUE),
                     y=1:3,
                     f2=factor(c("Bla", "AA", "GG"), ordered=TRUE),
                     f3=factor(c("gf", "th", "jk")))

   write.foreign(dat, datafile, codefile, package="SPSS")    file.show(codefile)

Surprisingly, applying the resulting SPSS syntax, all variables are nominal in SPSS for Windows Version 15.

So I added the following code to "writeForeignSPSS" to preserve the type of variables:

....

     ordinal <- sapply(df, is.ordered)
        if (any(ordinal)) {
            cat(paste("\nVARIABLE LEVEL", paste(varnames[ordinal],
                                                collapse=" "),
                      "(ORDINAL).\n"),
                file = codefile, append = TRUE)

}
num <- sapply(df, is.numeric) if (any(num)) { cat(paste("\nVARIABLE LEVEL", paste(varnames[num], collapse=" "), "(SCALE).\n"), file = codefile, append = TRUE)
}

...

just before the last line cat("\nEXECUTE.\n", file = codefile, append = TRUE). This works for me. Please find the modified function "writeForeignMySPSS" at the end of this email.

Maybe this is helpful, best regards

Sven

here comes my modiefied version:

   writeForeignMySPSS <- function (df, datafile, codefile, varnames = NULL)     {

        adQuote <- function (x) paste("\"", x, "\"", sep = "")

        dfn <- lapply(df, function(x) if (is.factor(x))
                      as.numeric(x)
        else x)
        write.table(dfn, file = datafile, row = FALSE, col = FALSE,
                    sep = ",", quote = FALSE, na = "", eol = ",\n")
        varlabels <- names(df)
        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 if (any(chv <- sapply(df, is.character))) { lengths <- sapply(df[chv], function(v) max(nchar(v))) if (any(lengths > 255L)) stop("Cannot handle character variables longer than 255") lengths <- paste("(A", lengths, ")", sep = "") star <- ifelse(c(FALSE, diff(which(chv) > 1)), " *", " ") dl.varnames[chv] <- paste(star, dl.varnames[chv], lengths)
}
cat("DATA LIST FILE=", adQuote(datafile), " free (\",\")\n", file = codefile) 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)
}
ordinal <- sapply(df, is.ordered) if (any(ordinal)) { cat(paste("\nVARIABLE LEVEL", paste(varnames[ordinal], collapse=" "), "(ORDINAL).\n"), file = codefile, append = TRUE)
}
num <- sapply(df, is.numeric) if (any(num)) { cat(paste("\nVARIABLE LEVEL", paste(varnames[num], collapse=" "), "(SCALE).\n"), file = codefile, append = TRUE)
}
cat("\nEXECUTE.\n", file = codefile, append = TRUE)
    }

R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Sat 11 Oct 2008 - 19:00:45 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 11 Oct 2008 - 19:31:21 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive