[R] Trying to use name of difference variable created in a function in call to wilcox.test function.

William Dunlap wdunlap at tibco.com
Wed Jan 13 00:27:49 CET 2016


Is the following function, myFormula(), what you are looking for?

myFormula <- function(stem, env = parent.frame()) {
    eval(bquote(.(as.name(paste0("Disch.",stem))) ~
.(as.name(paste0("Base.",stem))),
list(stem=as.name("rolling"))), envir=env)
}
str(myFormula("myStem"))
#Class "formula" language Disch.rolling ~ Base.rolling
# - attr(*, ".Environment")= <environment: R_GlobalEnv>


Bill Dunlap
TIBCO Software
wdunlap tibco.com

On Tue, Jan 12, 2016 at 3:10 PM, John Sorkin <jsorkin at grecc.umaryland.edu>
wrote:

> I am trying to write a function which will allow me to analyze many
> variables all of which have the same form, Base.stem and Disch.stem, where
> stem varies from variable to variable, e.g. Base.rolling and Disch.rolling,
> Base.standing, Disch.standing.
>
> I want to pass a dataframe and the stem of the name of the pre and post
> intervention variables. In my function I create the full pre and post
> intervention Base.stem and Disch.stem variables names (by using the paste
> function, varpre=paste("Base.",stem,sep="") and
> varpost=paste("Disch.",stem,sep="")). I also create and add to the
> dataframe the change variable (i.e. post-pre) formed as
> ch<-paste("Change.",stem,sep="") and compute the change in the variable:
> data[,ch]=data[,varpo]-data[,varpre].
>
> If, for example, I run the function doit(rolling, data), the function
> creates the full pre-intervention variable name Base.rolling, the
> post-intervention variable name Disch.rolling, and computes Change.rolling
> = Disch.rolling-Base.rolling. I want to use Change.rolling in a function,
> but I don't want to have to expressly specify the name of the outcome
> variable, i.e.
>
>
> fitwilcox<-wilcox.test(Change.rolling~RANDOMIZED,data=data,na.action=na.omit)
>
> I want to specify the constructed variable, i.e.
>
>  fitwilcox<-wilcox.test(ch~RANDOMIZED,data=data,na.action=na.omit)
>
> This does not work because ch is not in the dataframe, but Change.rolling
> is. How can I modify the call to the Wilcox.test function so I can specify
> the change variable constructor. I tried the following but it does not work:
>
>  fitwilcox<-wilcox.test(eval(ch,
> parent.frame())~RANDOMIZED,data=data,na.action=na.omit)
>
> DATA:
>
> > dput(data2)structure(list(Subj = c(115, 116, 117, 118, 119, 120, 121,
> 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
> 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147),     RANDOMIZED =
> c(1, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2,     1, 1, 2, 2, 1, 2, 1, 1, 2,
> 2, 1, 2, 1, 2, 2, 2, 2, 2, 2),     Base.rolling = c(0, 6, 6, 3, 3, 1, 4, 6,
> 4, 6, 4, 1, 3, NA,     1, 2, 4, 1, 4, 4, 4, 1, 5, 3, 2, 3, 1, 4, 0, 4, 1,
> NA, 3),     Disch.rolling = c(6, NA, NA, 6, 6, 3, 6, 6, 6, NA, NA, 6,
>  1, NA, 6, 6, 6, NA, 6, 6, 6, NA, 4, NA, 6, 6, NA, 6, NA,     6, 6, NA,
> NA)), .Names = c("Subj", "RANDOMIZED", "Base.rolling", "Disch.rolling"),
> class = "data.frame", row.names = c(NA, -33L))
>
>
> CODE:
>
> doit <- function(var,data){
>   var <-    deparse(substitute(var))
>   print(var)
>   # Create name for basline variable.
>   varpre<-paste("Base.",var,sep="")
>   # Create name for post variable.
>   varpo<-paste("Disch.",var,sep="")
>   # Create a name for the change variable.
>   ch<-paste("Change.",var,sep="")
>   print(ch)
>   # Compute change.
>   data[,ch]=data[,varpo]-data[,varpre]
>
>   cat("\nData used in the analyses\n")
>   print(data[,c("Subj","RANDOMIZED",ch)])
>   # This works when I expressly specify the change variable.
>   cat("This works, expressly specify change variable\n")
>
> fitwilcox1<-wilcox.test(Change.rolling~RANDOMIZED,data=data,na.action=na.omit)
>   print(fitwilcox1)
>
>   # This does not work.
>   cat("This does NOT work, try to use created change variable.\n")
>   fitwilcox2<-wilcox.test(eval(ch,
> parent.frame())~RANDOMIZED,data=data,na.action=na.omit)
>   print(fitwilcox2)
>   # Compute wilcoxon statistic.
> }
> doit(rolling,data2)
>
>
> Thank you,
> John
> John David Sorkin M.D., Ph.D.
> Professor of Medicine
> Chief, Biostatistics and Informatics
> University of Maryland School of Medicine Division of Gerontology and
> Geriatric Medicine
> Baltimore VA Medical Center
> 10 North Greene Street
> GRECC (BT/18/GR)
> Baltimore, MD 21201-1524
> (Phone) 410-605-7119
> (Fax) 410-605-7913 (Please call phone number above prior to faxing)
>
> Confidentiality Statement:
> This email message, including any attachments, is for ...{{dropped:16}}



More information about the R-help mailing list