I was able to figure this one out. It turns out that truncation was not the problem, as I had no variables with names longer than 32 characters (that is quite a long name!). I document my process here so that future users with the same problem can benefit.

First, I examined the code for the function throwing the error:

foreign:::make.SAS.names

This revealed that the error message I was getting was thrown any time the transformed/reformatted variable name was too long or duplicated another variable name:

    if (any(nchar(x) > nmax) || any(duplicated(x)))
        stop("Cannot uniquely abbreviate the variable names to ",
            nmax, " or fewer characters")

I was able to isolate which variables were the problem as follows:

which(duplicated(x))

where x is the vector of transformed variable names which were transformed using make.SAS.names code:

    x <- sub("^([0-9])", "_\\1", varnames)
    x <- gsub("[^a-zA-Z0-9_]", "_", x)
    x <- abbreviate(x, minlength = nmax)

This allowed to discover that I had two variables, retire_sp and retire.sp, which became the identical "retire_sp" after transformation.

Simple, really, but frustrating until you get into the code and see what is happening, and how to isolate the offending variables.

Andrew Miles


On Oct 20, 2010, at 1:18 PM, Nordlund, Dan (DSHS/RDA) wrote:

-----Original Message-----
From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-
project.org] On Behalf Of Andrew Miles
Sent: Wednesday, October 20, 2010 10:10 AM
To: r-help@r-project.org
Subject: [R] Problem exporting data using write.foreign

My question is about the write.foreign() command in the foreign
package.  I use a command like the following to try and output data
and a code file to read my data into SAS.

write.foreign(data.frame.object, datafile="filepath",
codefile="filepath", package="SAS", dataname="myData")

With my data set, it gives the following error:

Error in make.SAS.names(names(df), validvarname = validvarname) :
  Cannot uniquely abbreviate the variable names to 32 or fewer
characters

I tried to write reproducible code but could not.  I'm not sure where
to go from here.  What are the naming protocols for variables so that
they can be exported using write.foreign()?

Thanks!

Andrew Miles


Well, the error message tells you that the names must be unique when truncated to 32 characters. Apparently, you have at least 2 variables that have the same name when truncated to 32 characters.

Hope this is helpful,

Dan

Daniel J. Nordlund
Washington State Department of Social and Health Services
Planning, Performance, and Accountability
Research and Data Analysis Division
Olympia, WA 98504-5204


______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to