0

I need some clarification on the primary post on Passing a data.frame column name to a function

I need to create a function that will take a testSet, trainSet, and colName(aka predictor) as inputs to a function that prints a plot of the dataset with a GAM model trend line.

The issue I run into is:

 plot.model = function(predictor, train, test) {
      mod = gam(Response ~ s(train[[predictor]], spar = 1), data = train)
      ...
 }

 #Function Call
 plot.model("Predictor1", 1.0, crime.train, crime.test)

I can't simply pass the predictor as a string into the gam function, but I also can't use a string to index the data frame values as shown in the link above. Somehow, I need to pass the colName key to the game function. This issue occurs in other similar scenarios regarding plotting.

 plot <- ggplot(data = test, mapping = aes(x=predictor, y=ViolentCrimesPerPop))

Again, I can't pass a string value for the column name and I can't pass the column values either.

Does anyone have a generic solution for these situations. I apologize if the answer is buried in the above link, but it's not clear to me if it is.

Note: A working gam function call looks like this:

mod = gam(Response ~ s(Predictor1, spar = 1.0), data = train)

Where the train set is a data frame with column names "Response" & "Predictor".

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Devon Luongo
  • 127
  • 1
  • 2
  • 11

1 Answers1

1

Use aes_string instead of aes when you pass a column name as string.

plot <- ggplot(data = test, mapping = aes_string(x=predictor, y=ViolentCrimesPerPop))

For gam function:: Example which is copied from gam function's documentation. I have used vector, scalar is even easier. Its just using paste with a collapse parameter.

library(mgcv)
set.seed(2) ## simulate some data... 
dat <- gamSim(1,n=400,dist="normal",scale=2)

# String manipulate for formula
formula <- as.formula(paste("y~s(", paste(colnames(dat)[2:5], collapse = ")+s("), ")", sep =""))
b <- gam(formula, data=dat)

is same as

b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat)
discipulus
  • 2,665
  • 3
  • 34
  • 51