Question

I'm working with a bunch of SAS datasets and I prefer the variable names to all be lowercase, using read.sas7bdat, but I do it so often I wanted to write a function. This method works fine,

df <- data.frame(ALLIGATOR=1:4, BLUEBIRD=rnorm(4))
names(file1) <- tolower(names(file1))

but when I try to put it into a function it doesn't assign.

lower <- function (df) {names(df) <- tolower(names(df))}
lower(file1)

I know that there is some larger concept that I'm missing, that is blocking me. It doesn't seem to do anything.

Was it helpful?

Solution

Arguments in R are passed by copy. You have to do:

lower <- function (df) {
  names(df) <- tolower(names(df))
  df
}
file1 <- lower(file1)

OTHER TIPS

Although I don't see why you would do this rather than simply : names(df) <- tolower(names(df)), I think you should do:

 lower <- function (x) {tolower(names(x))}
 names(df) <- lower(df)

Here is an answer that I don't recommend using anywhere other than the globalenvironment but it does provide you some convenient shorthand. Basically we take care of the assignment inside the function, overwriting the object passed to it. Short-hand for you, but please be careful about how you use it:

tl <- function(x){
  ass <- all.names(match.call()[-1])
  assign( ass , setNames( x , tolower(names(x))) , env = sys.frame(sys.parent()) )
}

#  This will 'overwrite' the names of df...    
tl(df)

#  Check what df now looks like...
df
  alligator   bluebird
1         1  0.2850386
2         2 -0.9570909
3         3 -1.3048907
4         4 -0.9077282
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top