web-dev-qa-db-ja.com

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%>%summarise_each_(funs =(t.test(。〜vs))$ p.value、vars = disp:qsec)

しかし、それはエラーをスローします。

ボーナス:t %>% summarise(p = te$p.value)にグループ化変数の名前を含めるにはどうすればよいですか?

17
Misha

@aosmithおよび@Mishaとのすべての議論の後、ここに1つのアプローチがあります。 @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(グループ)のいずれかです。変数内の2つのグループ間でt検定を実行する場合(たとえば、ディップ)、@ aosmithが提案したようにデータをサブセット化する必要があるようです。貢献していただきありがとうございます。

私が最初に提案したことは、2つの列を単純に比較する別の状況で機能します。サンプルデータとコードは次のとおりです。

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検定を実行する場合は、次の方法が1つの方法になります。

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
14
jazzurro

私は強力な「ほうき」パッケージを使用した次のソリューションが好きです。

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

質問がかなり古いことに気づき、これが将来の世代の参考のための別の答えです。

これは、ハードコードされているのではなく、動的に生成された変数名を許可するため、受け入れられている回答よりも一般的です。

_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
_

このソリューションのアイデアは、NSEバージョン(_summarise_each__およびfuns)の代わりにSEバージョンのdplyr関数(_funs__および_summarise_each_)を使用することです。標準評価(SE)および非標準評価(NSE)の詳細については、vignette("nse")を確認してください。

6
akhmed

だから私は新しい関数をハックすることになった:df = dataframe、by_var =数式の右側、...数式の左側にあるすべての変数(dplyr/tidyrselect)。

例: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
}
2
Misha