Подтвердить что ты не робот

Dplyr суммирует несколько столбцов, используя t.test

Возможно ли каким-либо образом выполнить 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% > % summaryise_each_ (funs = (t.test(. ~ vs)) $p.value, vars = disp: qsec)

но он выдает ошибку.

Бонус: как t %>% summarise(p = te$p.value) также включить имя переменной группировки?

4b9b3361

Ответ 1

После всех обсуждений с @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-тест между двумя группами в переменной (например, провалы), кажется, вам нужно подмножество данных в качестве предложенного @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)

Если вы хотите запустить t-тесты для комбинации A-C и B-C, следующее будет одним из способов.

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

Ответ 2

Понимая, что вопрос довольно старый, вот еще один ответ для обращения будущих поколений.

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

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_each и funs). Для получения дополнительной информации о стандартной оценке (SE) и нестандартной оценке (NSE), пожалуйста, проверьте vignette("nse").

Ответ 3

Мне нравится следующее решение с использованием мощного пакета "метла":

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 = .)))

Ответ 4

Итак, я закончил взломать новую функцию: df = dataframe, by_var = правая часть формулы,... все переменные в левой части формулы (выбор dplyr/tidyr).

например: 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
}