NewBee
NewBee

Reputation: 1040

Error: calling arguments in user functions using quosures

I am trying to create cross tables using weights::wtd.chi.sq.

The data:

data_in <- read_table2("Q50_1   Q50_2   Q38 Q90 pov gender  wgt1 wgt2
never   always   Yes 2   High    M   1.3 0.4
sometimes   always   No  2   Med F   0.4 0.2
always   sometimes   Yes 4   Low F   1.2 0.7
never   never   No  2   High    M   0.5 0.7
always   always   No  4   High    M   0.7 0.8
sometimes   never   Yes 3   Low F   0.56 0.3
sometimes   never   Yes 2   Med F   0.9 0.1
")

x_tab function that feeds into another function:

xtab_func <- function(dat, col, target, wgt){
  col <- rlang::as_string(ensym(col))
  target <- rlang::as_string(ensym(target))
  wgt <- rlang::as_string(ensym(wgt))
  wtd.chi.sq(dat[[target]],dat[[col]], weight = dat[[wgt]])
  
}

Running it gives:

xtab_func(data_in, 'Q50_1','pov','wgt1')
    Chisq        df   p.value 
7.3395092 4.0000000 0.1189981 

Now I am looping through a vector of columns to repeat this for tabulation for each column. The error happens when I try to call target and wgt within the xtab function above. I've tried 3 different ways but none of them work.

crosstab <- function(dat, target, columns, wgt,target_name, school_type){
  # browser()
  target <- rlang::as_string(ensym(target))
  print(target)
  wgt <- rlang::as_string(ensym(wgt))
  
  target_name <- enquo(target_name)
  school_type <- enquo(school_type)
  
  d <- list()

  for (i in columns){
    # OPTION 1
    # x <- xtab_func(dat, i, !!target, !!wgt)
    # OPTION 2
    x <- xtab_func(dat, i, target, wgt)
    # OPTION 3 
    # x <- xtab_func(dat, i, dat[[target]],dat[[wgt]])
    x$i <- i

    d[[i]] <- x
    df <- do.call(rbind, d) 
  }
  return(df)

  
}

When I run this I could see the chi values for the columns by pov...

cols <- data_in %>% select(starts_with("Q"))
cols <- names(cols)
crosstab(data_in,'pov',cols, 'wgt1', 'pov','trad')

But I get these errors:

 Error: Only strings can be converted to symbols 
 OR 
  Error in model.frame.default(formula = weight ~ var1 + var2) : 
  invalid type (NULL) for variable 'var1'

Any idea how I call those variables? Thank you!

Upvotes: 0

Views: 29

Answers (2)

akrun
akrun

Reputation: 887213

With the OP's default function xtab_func, we can modify the crosstab to

library(purrr)
library(dplyr)
crosstab <- function(dat, target, columns, wgt,target_name, school_type){
  purrr::map_dfr(columns, ~ {
    xtab_func(dat, !!.x, !!target, !!wgt) 
  })  
}

-testing

crosstab(data_in,'pov', cols, 'wgt1', 'pov','trad')
# A tibble: 4 x 3
  Chisq    df p.value
  <dbl> <dbl>   <dbl>
1  7.34     4   0.119
2  6.02     4   0.198
3  1.47     2   0.480
4  4.83     4   0.306

Upvotes: 1

MrFlick
MrFlick

Reputation: 206253

It's not clear to me at all why you are trying to use all the rlang stuff when you are just passing character values to your functions. This could be greatly simplified to

xtab_func <- function(dat, col, target, wgt){
  weights::wtd.chi.sq(dat[[target]],dat[[col]], weight = dat[[wgt]])
}

and

crosstab <- function(dat, target, columns, wgt,target_name, school_type){
  d <- list()
  for (i in columns){
    x <- as.data.frame(as.list(xtab_func(dat, i, target, wgt)))
    x$i <- i
    d[[i]] <- x
  }
  df <- do.call(rbind, d) 
  return(df)
}

Just use [[]] with character values to index into your data.

Upvotes: 1

Related Questions