table() внутри as.formula() с использованием paste() в функции R

Я работаю со следующим набором данных

hsb2 <- within(read.csv("https://stats.idre.ucla.edu/stat/data/hsb2.csv"), {
  race <- as.factor(race)
  schtyp <- as.factor(schtyp)
  prog <- as.factor(prog)
})

Я хочу написать функцию высшего порядка для выполнения статистических тестов по категориальным зависимым переменным (таким как хи-квадрат или Фишер).

В качестве примера я запускаю эти два теста:

chisq.test(table(hsb2$female, hsb2$schtyp))
chisq.test(table(hsb2$race, hsb2$schtyp))

Я определяю свою функцию высшего порядка так:

multi.tests.categorical <- function(fun = chisq.test, df, vars, group.var, ...) {
      sapply(simplify = FALSE,                                    
             vars,                                                
             function(var) {
               formula <- as.formula(paste("table(",var, ",", group.var,")")) # create a formula with outcome and grouping var.
               fun(data = df, formula, ...)                     # perform test with a given fun, default t.test
             }
      )
    }

Затем я применяю свою функцию более высокого порядка в одном блоке кода:

res.multi.chisq.tests <-
  multi.tests.categorical(fun = chisq.test,
              df = hsb2,
              vars = "schtyp",
              group.var = c("female","race"))
res.multi.chisq.tests

Тем не менее, я получаю следующее сообщение об ошибке:

Ошибка в таблице (schtyp, женский): объект 'schtyp' не найден

Я подозреваю, что мое использование table() в as.formula, возможно, является причиной этого? Любая помощь приветствуется.

1 ответ

Решение

Векторизация может быть

#sample data
hsb2 <- within(read.csv("https://stats.idre.ucla.edu/stat/data/hsb2.csv"), {
  race <- as.factor(race)
  schtyp <- as.factor(schtyp)
  prog <- as.factor(prog)
})

schtyp_idx <- match("schtyp", colnames(hsb2))
col_idx <- match(c("female", "race"), colnames(hsb2))
chisq.test_resultList = mapply(function(x,y){chisq.test(table(hsb2[,x],hsb2[,y]))}, schtyp_idx, col_idx)
chisq.test_resultList
Другие вопросы по тегам