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?

1
  • People should really start reading r-faqs sometimes. This question is being asked about once a day Commented Sep 17, 2015 at 15:00

1 Answer 1

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
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.