使用 group_by 并行 wilcox.test 并总结

Posted

技术标签:

【中文标题】使用 group_by 并行 wilcox.test 并总结【英文标题】:Parallel wilcox.test using group_by and summarise 【发布时间】:2016-04-07 11:40:57 【问题描述】:

必须有一种 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)

错误的调用产生了这个错误:

Error in wilcox.test.formula(c(1.09057358373486, 
    2.28465932554436, 0.885617572657959,  : 'formula' missing or incorrect

感谢您的帮助;我希望它对其他有类似问题的人也有帮助。

【问题讨论】:

其他答案更完整,但只是为了列出所有可能的解决方案:df %&gt;% group_by(id1) %&gt;% summarise(w=wilcox.test(x[id2==1], x[id2==2], paired=FALSE)$p.value) 【参考方案1】:

使用 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)

输出

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

注意我在 group_bysummarize 之间添加了 do 函数。 希望对你有帮助。

【讨论】:

使用 group_by 和管道的优秀答案,这是原始问题的一部分。我选择了@patrickmdnet 的回复作为官方答案,因为它优雅的 dplyr 方法对我更复杂的真实世界数据框“开箱即用”,这将一些未知的扳手放入此处列出的 group_by/do 管道方法中。跨度> 【参考方案2】:

您可以使用 base R 来完成此操作(尽管结果是一个繁琐的列表):

by(df, df$id1, function(x)  wilcox.test(x~id2, data=x, paired=FALSE)$p.value )

或使用 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

【讨论】:

以上是关于使用 group_by 并行 wilcox.test 并总结的主要内容,如果未能解决你的问题,请参考以下文章

在summarize()中使用group_by()的语法[关闭]

使用 group_by 和 summarise 时出现重复行

了解 dplyr 和 group_by

使用 group_by 后根据条件转换哈希值

使用 group_by(多个变量)时的 dplyr 问题

在 group_by 中使用列索引而不是名称