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

时间:2016-04-17 12:49:53

标签: r loops lapply sapply

我对编程和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函数,但我不知道如何。

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

1 个答案:

答案 0 :(得分:0)

在R中,对于同样的问题,通常有很多解决方案。以下是我将如何解决这个问题。

首先,我会分割我的数据并使用一个带有实验的数据框和一个带有控件的数据框:

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

然后我会按组拆分我的实验数据,并将其与我的控制测量结果一起提供给我的测试。请注意,这种结构可以很容易地从测试中提取更多值:只返回(命名)向量。

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)
})

结合表格很容易:

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)