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)
}