R: упаковка t.test в функции - PullRequest
2 голосов
/ 23 марта 2019

Почему эта функция не выполняется?

my_ttest <- function(df, variable, by){
    variable <- enquo(variable)
    by <- enquo(by)

    t.test(!!variable ~ !!by, df)
}

my_ttest (mtcars, mpg, am) Ошибка в is_quosure (e2): отсутствует аргумент "e2", без значения по умолчанию

Но этот работает

my_mean <- function(df, variable, by){
        variable <- enquo(variable)
        by <- enquo(by)

        df %>% group_by(!!by) %>% summarize(mean(!!variable))
}



my_mean(mtcars, mpg, am)
# A tibble: 2 x 2
     am `mean(mpg)`
  <dbl>       <dbl>
1     0        17.1
2     1        24.4

(dplyr_0.8.0.1) * +1011 *

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Если мы хотим передать аргументы отдельно в «my_ttest» и построить формулу внутри функции, преобразуем выражение (enquo) в символ (sym) для обоих переменных: «by», затемсоздайте выражение ('expr1') и eval uate` it

my_ttest <- function(df, variable, by, env = parent.frame()){
    variable <- rlang::sym(rlang::as_label(rlang::enquo(variable)))
    by <- rlang::sym(rlang::as_label(rlang::enquo(by)))

    exp1 <- rlang::expr(!! variable ~ !! by)



    t.test(formula = eval(exp1), data = df)

}


my_ttest(mtcars, mpg, am)
#Welch Two Sample t-test

#data:  mpg by am
#t = -3.7671, df = 18.332, p-value = 0.001374
#alternative hypothesis: true difference in means is not equal to 0
#95 percent confidence interval:
# -11.280194  -3.209684
#sample estimates:
#mean in group 0 mean in group 1 
#       17.14737        24.39231 

Или, как упомянуто в комментариях @lionel, это можно сделать напрямую с помощью ensym

my_ttest <- function(df, variable, by, env = parent.frame()){  

  exp1 <- expr(!!ensym(variable) ~ !!ensym(by))

    t.test(formula = eval(exp1), data = df)

  }


my_ttest(mtcars, mpg, am)

РЕДАКТИРОВАТЬ: На основе комментариев @ lionel

2 голосов
/ 23 марта 2019

Не каждая функция (и пакет) работает с аккуратной оценкой. t.test принимает числовые векторы x,y в качестве аргументов или формулу. В вашем примере вы можете указать формулу и фрейм данных, хотя на самом деле это не кажется более эффективным, чем прямой вызов t.test.


my_ttest <- function(df, frma) {
  t.test(frma, df)
}

my_ttest(mtcars, mpg ~ am)
#> 
#>  Welch Two Sample t-test
#> 
#> data:  mpg by am
#> t = -3.7671, df = 18.332, p-value = 0.001374
#> alternative hypothesis: true difference in means is not equal to 0
#> 95 percent confidence interval:
#>  -11.280194  -3.209684
#> sample estimates:
#> mean in group 0 mean in group 1 
#>        17.14737        24.39231

Создано в 2019-03-23 ​​пакетом представ. (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...