There are times when we need to write a function that makes changes to a generic data frame that is passed as an argument. Let’s say, for example, that we want to write a function that converts to factor any variable with names starting with a capital letter. There are a few issues involved in this problem, including:

CapitalFactors <- function(dataset) {
  # Gets text version name of dataset
  data.name = substitute(dataset)

  # Loops over variable names of dataset
  # and extracts the ones that start with uppercase
  for(var.name in names(dataset)){
    if(substr(var.name, 1, 1) %in% LETTERS) {
      left <- paste(data.name, '$', var.name, sep = '')
      right <- paste('factor(', left, ')', sep = '')
      code <- paste(left, '=', right)
      # Evaluates the parsed text, using the parent environment
      # so as to actually update the original data set
      eval(parse(text = code), envir = parent.frame())
    }
  }
}

# Create example dataset and display structure
example <- data.frame(Fert = rep(1:2, each = 4),
                      yield = c(12, 9, 11, 13, 14, 13, 15, 14))
str(example)

'data.frame':    8 obs. of  2 variables:
$ Fert : int  1 1 1 1 2 2 2 2
$ yield: num  12 9 11 13 14 13 15 14

# Use function on dataset and display structure
CapitalFactors(example)
str(example)

'data.frame':    8 obs. of  2 variables:
$ Fert : Factor w/ 2 levels "1","2": 1 1 1 1 2 2 2 2
$ yield: num  12 9 11 13 14 13 15 14

And that’s all. Now the Fert integer variable has been converted to a factor. This example function could be useful for someone out there.