2017-11-18 100 views
1

我使用这pretty nice代码来执行多个t.test保持独立变量不变!Dplyr和多重t检验(保持相同的IV)

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()已被弃用。改为使用summarise_all(), summarise_at()summarise_if()。要映射funs在 选择的变量,使用summarise_at()

当我改变代码_all,在或_IF,此功能利己不再工作。我正在寻求一些建议,并非常感谢您的支持。

感谢

回答

1

不再创建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 
+0

谢谢,@akrun。你能提供一个代码,我可以用〜函数替换这个t.test到t.test吗?这个t.test给出了考虑两个连续变量的结果,我的目标是两个连续的dv(分类) – Luis

+0

@Luis从您的评论中不清楚。你可以发布一个新的问题。 – akrun

+0

谢谢。是的,这段代码解决了我的问题。我会点击那里! @akrun – Luis