2

Suppose I have a data frame that looks like this:

df1 <- data.frame("long name 1"=c(rnorm(n = 100, mean = 0, sd = 1),NA),
                  treatment=sample(x = c(0,1), size = 101, replace = T))
names(df1) <- c("long name 1", "treatment")

I want to create a function with 5 arguments. Right now I have this:

test.f <- function(data, vname, tname, tvalue=1, cvalue=0) {
  vname<-as.name(vname)
  tname <- as.name(tname)
  mean.Xt <- mean(data$vname[data$tname==tvalue], na.rm = T)
}

When I run it I get the following error:

test.f(data = df1, vname = "long name 1", tname = "treatment")
Warning message:
  In mean.default(data$vname[data$tname == tvalue], na.rm = T) :
  argument is not numeric or logical: returning NA

Is there a way of doing what I want?

Ignacio
  • 7,646
  • 16
  • 60
  • 113

1 Answers1

5

It would be better to use [[ instead of $ inside a function for selecting columns.

test.f <- function(data, vname, tname, tvalue=1, cvalue=0) {
    mean(data[[vname]][data[[tname]]==tvalue], na.rm = T)
 }

test.f(data = df1, vname = "long name 1", tname = "treatment")
#[1] 0.1397585

which is the same as

mean(df1$`long name 1`[df1$treatment==1], na.rm=TRUE)
#[1] 0.1397585
akrun
  • 874,273
  • 37
  • 540
  • 662