R - 按列进行分组wilcox.test(多线程?)
2019-10-17 本文已影响0人
吴十三和小可爱的札记
记事本的念头起源于要处理要求日益奇怪的甲方和记忆日渐衰退的乙方的冲突。开通后一度忘记了搞这个的初衷,今天终于又重新感受到被失忆支配的恐惧,特记录下过程,免得又失忆。
现在面对的问题是甲方有一组数据,大概有100列,每一列代表一个实验组,要对列按参数分组后进行wilcox.test。
# 生成示例数据
ID = rep(c("sample1","sample2"), each = 50)
dat <- matrix(sample(runif(n = 5000, min = 1, max = 10)),
nrow = 100, ncol = 50)
Gene <- paste0("Gene",1:50)
colnames(data) <- Gene
data <- as.data.frame(data)
data_c = cbind(ID, data)
# for 循环 - 耗时0.14 s。
for_P <- c()
for (i in (2 : ncol(data_c))){
xy = wilcox.test( data_c[ ,i] ~ ID, data =data_c)
for_P[[i]] = xy$p.value
}
# 由于第一组是分组变量,所以输出结果虽然是51个P值,但第一个是NA
# R多线程包有foreach(for循环),parallel(apply家族)
# foreach(for循环) - 耗时0.03 s
library(doParallel)
library(foreach)
# 找到核心个数
cl.cores = detectCores()
# 构建核心类,并不是越多越好
cl <- makeCluster(cl.cores - 1)
# 调用核心
registerDoParallel(cl.cores)
foreach_p <- foreach(i = 2 : ncol(data_c), .combine = "c") %dopar% {wilcox.test( data_c[,i] ~ ID, data = data_c)$p.value}
foreach_p <- cbind(Gene, dai)
# 退出
stopImplicitCluster()
# aplly函数 - 耗时0.06 s
test <- function(x){
sum <- wilcox.test(x[c(1:50)], x[c(51:100)])
sum$p.value
}
apply_P <- apply(dat , 2, test)
可以看到多线程效率 > apply家族效率 > for 循环效率。
但apply输出的结果非常复杂,我还不会解析,以后再填坑。
tips: apply也是循环,每一次循环都提取想要的结果就行了。o(╥﹏╥)o