次のようにデータセットを再形成せずに、同じカテゴリ変数に対して複数の変数に対して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)
にグループ化変数の名前を含めるにはどうすればよいですか?
@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
私は強力な「ほうき」パッケージを使用した次のソリューションが好きです。
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 = .)))
質問がかなり古いことに気づき、これが将来の世代の参考のための別の答えです。
これは、ハードコードされているのではなく、動的に生成された変数名を許可するため、受け入れられている回答よりも一般的です。
_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")
を確認してください。
だから私は新しい関数をハックすることになった: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
}