是否有可能以某种方式针对相同的分类变量对多个变量执行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)
如何也包含分组变量的名称?
答案 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_each
和funs
)。有关标准评估(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
}