I am setting up a function to make it easier to run weights:wtd.chi.sq on a number of columns simultaneously.
Here is my sample data:
library(weights)
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
")
I would use this line to find the chi sq value for Q50_1 by pov:
wtd.chi.sq(data_in$Q50_1,data_in$pov, weight = data_in$wgt1)
Chisq df p.value
7.3395092 4.0000000 0.1189981
Since I need to repeat this for a df with thousands of variables, I have set up a function to run it. wtd.chi.sq takes vectors, not column names, so it's a little tricky to feed the relevant column in. The function I wrote looks like this:
xtab_func <- function(dat, col, target, wgt){
col <- sym(col)
target <- enquo(target)
wgt <- enquo(wgt)
weights::wtd.chi.sq(noquote(paste0(dat,"$",!!target)), noquote(paste0(dat,"$",!!col)), weight = noquote(paste0(dat,"$",!!wgt)))
}
But when I run it:
xtab_func('dat', 'Q50_1','pov','wgt1')
Error: Quosures can only be unquoted within a quasiquotation context.
# Bad:
list(!!myquosure)
# Good:
dplyr::mutate(data, !!myquosure)
Run `rlang::last_error()` to see where the error occurred.
Could anyone tell me what is going on here?!
It may be better to use ensym
as we can pass either quoted or unquoted as input. The symbol is then converted to string with as_string
, then we use the base R
Extract
method ([[
) to extract the column as a vector to be used in wtd.chi.sq
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]])
}
-testing
xtab_func(data_in, 'Q50_1','pov','wgt1')
Chisq df p.value
7.3395092 4.0000000 0.1189981
xtab_func(data_in, Q50_1, pov, wgt1)
Chisq df p.value
7.3395092 4.0000000 0.1189981
NOTE: The dataset passed into the function is not quoted