到目前为止,我所读到的关于R中并行处理的所有内容都涉及查看一个数据帧的多行。
但是,如果我有两个或三个大型数据帧,我想执行一个长函数怎么办?我可以将函数的每个实例分配给特定的核心,这样我就不必等待它按顺序工作了吗?我在窗户上。
让我们说这是功能:
AltAlleleRecounter <- function(names,data){
data$AC <- 0
numalleles <- numeric(length=nrow(data))
for(i in names){
genotype <- str_extract(data[,i],"^[^/]/[^/]")
GT <- dstrfw(genotype,c('character','character','character'),c(1L,1L,1L))
data[GT$V1!='.',]$AC <- data[GT$V1!='.',]$AC+GT[GT$V1!='.',]$V1+GT[GT$V1!='.',]$V3
numalleles[GT$V1!='.'] <- numalleles[GT$V1!='.'] + 2
}
data$AF <- data$AC/numalleles
return(data)
}
我想要做的基本上是这个(通用的伪代码):
wait_till_everything_is_finished(
core1="data1 <- AltAlleleRecounter(sampleset1,data1,1)",
core2="data2 <- AltAlleleRecounter(sampleset2,data2,2)",
core3="data3 <- AltAlleleRecounter(sampleset3,data3,3)"
)
其中所有三个命令都在运行但程序在完成所有操作后才会进行。
编辑: 布莱恩的建议奏效了。我用我的第二个列表替换了“otherList”。这是示例代码:
myframelist <- list(data1,data2)
mynameslist <- list(names1,names2)
myframelist <- foreach(i=1:2) %dopar% (AltAlleleRecounter(mynameslist[[i]],myframelist[[i]]))
myfilenamelist <- list("data1.tsv","data2.tsv")
foreach(i=1:2) %dopar% (write.table(myframelist[[i]], file=myfilenamelist[[i]], quote=FALSE, sep="\t", row.names=FALSE, col.names=TRUE))
数据变量是数据框,名称变量只是字符向量。您可能需要重新加载一些软件包。
答案 0 :(得分:2)
尝试这样的事情:
library(doParallel)
library(foreach)
cl<-makeCluster(6) ## you can set up as many cores as you need/want/have here.
registerDoParallel(cl)
getDoParWorkers() # should be the number you registered. If not, something went wrong.
df1<-data.frame(matrix(1:9, ncol = 3))
df2<-data.frame(matrix(1:9, ncol = 3))
df3<-data.frame(matrix(1:9, ncol = 3))
mylist<-list(df1, df2, df3)
otherList<-list(1, 2, 3)
mylist<-foreach(i=1:3) %dopar% (mylist[[i]] * otherList[[i]])
mylist
[[1]]
X1 X2 X3
1 4 7
2 5 8
3 6 9
[[2]]
X1 X2 X3
2 8 14
4 10 16
6 12 18
[[3]]
X1 X2 X3
3 12 21
6 15 24
9 18 27
我经常使用主题建模不同的数据库。我们的想法是创建要将函数应用到的数据列表,然后让foreach
将函数并行应用于这些索引列表。对于您的示例,您必须列出data.frames
和另一个样本集列表。