Dplyr 和多重 t 检验(保持相同的 IV)

Dplyr and multiple t test (keeping the same IV)

我正在使用此 pretty nice 代码来执行多个 t.test 保持自变量不变!

data(mtcars)
library(dplyr)
vars_to_test <- c("disp","hp","drat","wt","qsec")
iv <- "vs"
mtcars %>%
  summarise_each_(
    funs_( 
      sprintf("stats::t.test(.[%s == 0], .[%s == 1])$p.value",iv,iv)
    ), 
    vars = vars_to_test)

不幸的是,dplyr 更新了,我一直面临这个报告

summarise_each() is deprecated. Use summarise_all(), summarise_at() or summarise_if() instead. To map funs over a selection of variables, use summarise_at()

当我更改_all、at 或_if 的代码时,此功能不再起作用。我正在寻找一些建议,非常感谢您的支持。

谢谢

不是用 sprintf 创建字符串表达式然后对其求值,我们可以使用求值 'vs' 将其转换为符号然后求值

library(dplyr)
mtcars %>%
   summarise_at(vars(vars_to_test), funs( 
     try(stats::t.test(.[(!! rlang::sym(iv)) == 0], .[(!! rlang::sym(iv)) == 1])$p.value)
  ))
#          disp           hp       drat           wt         qsec
#1 2.476526e-06 1.819806e-06 0.01285342 0.0007281397 3.522404e-06

如果我们真的想解析一个表达式,请使用 rlang_parse_exprrlang::eval_tidy 以及 sym

library(rlang)
eval_tidy(parse_expr("mtcars %>% summarise_at(vars(vars_to_test), 
                funs(t.test(.[(!!sym(iv))==0],
                                   .[(!!sym(iv))==1])$p.value ))"))
#          disp           hp       drat           wt         qsec
#1 2.476526e-06 1.819806e-06 0.01285342 0.0007281397 3.522404e-06