cur*_*rat 6 r group-summaries dplyr magrittr
必须有一种R-ly方式wilcox.test使用group_by并行调用多个观察.我已经花了很多时间阅读这篇文章,但仍然无法弄清楚是否wilcox.test有这样的工作.下面的示例数据和代码,使用magrittr管道和summarize().
library(dplyr)
library(magrittr)
# create a data frame where x is the dependent variable, id1 is a category variable (here with five levels), and id2 is a binary category variable used for the two-sample wilcoxon test
df <- data.frame(x=abs(rnorm(50)),id1=rep(1:5,10), id2=rep(1:2,25))
# make sure piping and grouping are called correctly, with "sum" function as a well-behaving example function
df %>% group_by(id1) %>% summarise(s=sum(x))
df %>% group_by(id1,id2) %>% summarise(s=sum(x))
# make sure wilcox.test is called correctly
wilcox.test(x~id2, data=df, paired=FALSE)$p.value
# yet, cannot call wilcox.test within pipe with summarise (regardless of group_by). Expected output is five p-values (one for each level of id1)
df %>% group_by(id1) %>% summarise(w=wilcox.test(x~id2, data=., paired=FALSE)$p.value)
df %>% summarise(wilcox.test(x~id2, data=., paired=FALSE))
# even specifying formula argument by name doesn't help
df %>% group_by(id1) %>% summarise(w=wilcox.test(formula=x~id2, data=., paired=FALSE)$p.value)
Run Code Online (Sandbox Code Playgroud)
越野车调用产生此错误:
Error in wilcox.test.formula(c(1.09057358373486,
2.28465932554436, 0.885617572657959, : 'formula' missing or incorrect
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助; 我希望它对有类似问题的其他人也有所帮助.
您可以使用do函数轻松完成任务(在加载dplyr库后调用?do).使用您的数据,链将如下所示:
df <- data.frame(x=abs(rnorm(50)),id1=rep(1:5,10), id2=rep(1:2,25))
df <- tbl_df(df)
res <- df %>% group_by(id1) %>%
do(w = wilcox.test(x~id2, data=., paired=FALSE)) %>%
summarise(id1, Wilcox = w$p.value)
Run Code Online (Sandbox Code Playgroud)
res
Source: local data frame [5 x 2]
id1 Wilcox
(int) (dbl)
1 1 0.6904762
2 2 0.4206349
3 3 1.0000000
4 4 0.6904762
5 5 1.0000000
Run Code Online (Sandbox Code Playgroud)
注意我在group_by和summarize之间添加了do函数.
我希望它有所帮助.
您可以使用基本 R 来执行此操作(尽管结果是一个繁琐的列表):
by(df, df$id1, function(x) { wilcox.test(x~id2, data=x, paired=FALSE)$p.value })
Run Code Online (Sandbox Code Playgroud)
或使用 dplyr:
ddply(df, .(id1), function(x) { wilcox.test(x~id2, data=x, paired=FALSE)$p.value })
id1 V1
1 1 0.3095238
2 2 1.0000000
3 3 0.8412698
4 4 0.6904762
5 5 0.3095238
Run Code Online (Sandbox Code Playgroud)