dplyr使用t.test汇总多个列

时间:2014-10-07 20:04:35

标签: r dplyr

是否有可能以某种方式针对相同的分类变量对多个变量执行t.test,而不进行如下数据集的重新整形?

data(mtcars)
library(dplyr)
library(tidyr)
j <- mtcars %>% gather(var, val, disp:qsec)
t <- j %>% group_by(var) %>% do(te = t.test(val ~ vs, data = .))

t %>% summarise(p = te$p.value)

我尝试过使用

  

mtcars%&gt;%summarise_each_(funs =(t.test(.~vs))$ p.value,vars = disp:qsec)

但它会引发错误。

奖励:t %>% summarise(p = te$p.value)如何也包含分组变量的名称?

4 个答案:

答案 0 :(得分:13)

在与@aosmith和@Misha进行所有讨论之后,这是一种方法。正如@aosmith在他/她的评论中写道,你想要做以下几点。

mtcars %>%
    summarise_each(funs(t.test(.[vs == 0], .[vs == 1])$p.value), vars = disp:qsec)

#         vars1        vars2      vars3        vars4        vars5
#1 2.476526e-06 1.819806e-06 0.01285342 0.0007281397 3.522404e-06

vs是0或1(组)。如果你想在变量中的两个组之间运行t检验(例如,dips),你似乎需要像@aosmith建议的那样对数据进行子集化。我想感谢你的贡献。

我最初建议的是在另一种情况下工作,您只需比较两列。这是样本数据和代码。

foo <- data.frame(country = "Iceland",
                  year = 2014,
                  id = 1:30,
                  A = sample.int(1e5, 30, replace = TRUE),
                  B = sample.int(1e5, 30, replace = TRUE),
                  C = sample.int(1e5, 30, replace = TRUE),
                  stringsAsFactors = FALSE)

如果您想对A-C和B-C组合进行t检验,以下是一种方法。

foo2 <- foo %>%
        summarise_each(funs(t.test(., C, pair = TRUE)$p.value), vars = A:B) 

names(foo2) <- colnames(foo[4:5])

#          A         B
#1 0.2937979 0.5316822

答案 1 :(得分:6)

我喜欢以下解决方案,使用强大的&#34;扫帚&#34;包:

library("dplyr")
library("broom")

your_db %>%
  group_by(grouping_variable1, grouping_variable2 ...) %>%
  do(tidy(t.test(variable_u_want_2_test ~ dicothomous_grouping_var, data = .)))

答案 2 :(得分:4)

意识到这个问题相当陈旧,这是后代参考的另一个答案。

这比接受的答案更通用,因为它允许动态生成变量名而不是硬编码。

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)

产生这个:

          disp           hp       drat           wt         qsec
1 2.476526e-06 1.819806e-06 0.01285342 0.0007281397 3.522404e-06

此解决方案的想法是使用SE版本的dplyr函数(summarise_each_funs_)而不是NSE版本(summarise_eachfuns)。有关标准评估(SE)和非标准评估(NSE)的更多信息,请查看vignette("nse")

答案 3 :(得分:2)

所以我最终破解了一个新功能: df = dataframe,by_var =公式的右侧,...公式左侧的所有变量(dplyr / tidyr select)。

例如: mult_t.test(mtcars,vs,disp:qsec)

mult_t.test<-function(df,by_var,...){
  require(dplyr)
  require(tidyr)
  by_var<-deparse(substitute(by_var))
  j<-df%>%gather(var,val,...)
  t<-j%>%group_by(var)%>%do(v=tes(.,by_var))
  k<-data.frame(levels(t$var),matrix(unlist(t$v),ncol=3,byrow = T))
  names(k)<-c("var",names(t$v[[1]]))
  k
}


tes<-function(df,vart){
  x<-t.test(df$val~df[[vart]])
  p<-x$estimate
  p<-c(p,p.val=x$p.value)
  p
}