如何针对 R 中的一个指定控制组循环测试?

How to loop a test against one designated control group in R?

我对编程和 R 完全陌生,但我有一个数据集,只能使用更强大的统计程序(例如 R)进行分析。

我有一个大而简单的数据集,由数千个不同的组和多个样本组成,我想通过 mann whitney U 检验将其与对照组进行比较,数据结构如下图所示。

Group, Measurements
a      0.14534
cont   0.42574
d      0.36347
c      0.14284
a      0.23593
d      0.36347
cont   0.33514
cont   0.29210
b      0.36345
...

问题出在测试的性质要求只能指定两组。但是,因为我有超过 1 个组,所以它不起作用。

这是我目前所拥有的,如您所见,它不能以重复的方式工作,只有当我的输入文件中有两个组时才有效。

data1 = read.csv(file.choose(), header=TRUE, stringsAsFactors=FALSE)
attach(data1)
testoutput <- wilcox.test(group ~ measurement, mu=0, alt="two.sided", conf.int=TRUE, conf.level=0.95, paired=FALSE, exact=FALSE, correct=TRUE)
write.table(testoutput$p.value, file="mwUtest.tsv", sep="\t")

我如何正确编写和循环测试,以便它针对我指定的控制组测试我的所有组?我假设在 wilcox.test 之前使用了 sapply 或 lapply 函数,但我不知道如何使用。

如果之前有人提出过这个简单的问题,我很抱歉,但我找不到关于这个具体问题的任何以前的问题。

在 R 中,对于同一个问题通常有多种解决方案。这是我解决这个问题的方法。

首先,我会拆分我的数据,一个数据框带有实验,一个数据框带有控件:

experiments <- dat[dat$group!="cont",]
controls <- dat[dat$group=="cont",]

然后我会按组拆分我的实验数据,并将其与我的控制测量一起提供给我的测试。请注意,这种构造使得从测试中提取更多值变得容易:只需 return 一个(命名的)向量。

result <- lapply(split(experiments, experiments$group),function(x){
  mytest = wilcox.test(x$measurement,controls$measurement,mu=0, alt="two.sided", conf.int=TRUE, conf.level=0.95, paired=FALSE, exact=FALSE, correct=TRUE)
  return(mytest$p.value)
})

然后合并到 table 很容易:

output <- do.call(rbind,result)

使用的数据:

set.seed(123)
nobs=100
dat <- data.frame(group=sample(c(LETTERS[1:6],"cont"),nobs,T),
                  measurement=runif(nobs),stringsAsFactors=F)