1

I'm trying to use an excel file to manage information on covariates to include in many various models, which are estimated on different subgroups of my data.

I'm hoping to create a function to make it easy to loop over these models, where the function takes as input the name of the model. The model name is used to select covariates from "modelinfo" and to select the sample from "modeldata"

However, I'm not sure how to use an argument for these two distinct purposes. The below minimum working example uses the argument "modelnum" to refer to columns in modelinfo and rows in modeldata, but I can only get it to recognize the argument as a string to restrict the data by rows.

How can an argument be used both as a string and as a column name?

library(tidyverse) 

modelinfo <- tribble(
            ~covars,~`model 1`,~`model 2`,
            "x1"    ,  1        , 0,
            "x2"    , 0         , 1
)

modeldata <- tribble(
             ~x1,   ~x2,  ~model,
             3,      3,    "model 1",
             4,      1,    "model 2",
             1,      3,    "model 1",
             2,      4,    "model 3"
)

testfun <- function(modelnum){
  covars <- modelinfo %>% 
    filter({{modelnum}}==1)
  
  data <- modeldata %>% 
    filter(model==modelnum)
  
  output=c(covars,data)
  return(output)
  
}

testfun(modelnum="model 1")

1 Answer 1

1

Here, it may be better to use .data with [[ to subset instead of {{}} as the input passed is character string

testfun <- function(modelnum){
  covars <- modelinfo %>% 
    filter(.data[[modelnum]]==1)
  
  data <- modeldata %>% 
    filter(model==modelnum)
  
  output=c(covars,data)
  return(output)
  
}

-testing

testfun(modelnum="model 1")
$covars
[1] "x1"

$`model 1`
[1] 1

$`model 2`
[1] 0

$x1
[1] 3 1

$x2
[1] 3 3
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.