我一直在使用apply將data.frame的每一行提交給R中的函式,使用Windows 10。 這種方法是有效的。然而,隨著函式變得越來越復雜,資料集越來越大,這種方法變得不可行了。 因此,我希望使用并行處理來提交和運行data.frame的每一行到function。
我以前在我的Windows 10筆記本和Unix集群上都使用過doParallel,但只是為了運行多個外部R檔案。 從來沒有在一個R檔案中提交data.frame的獨立行到一個function。 誰能告訴我如何實作后者? 如果我不得不這樣做,我想我可以為下面代碼中的data.frame master.iter的每一行創建單獨的R檔案,但一定有一個更簡單的方法。
下面是一個微不足道的例子,它與apply一起運行,并得到了預期的結果:
master.iter <- read.table(text = '
情景 aaa bbb ccc ddd eee
1 1 5 0 20 10
2 1 10 0 2000 1000
',頭= TRUE。 stringsAsFactors = FALSE)。
主人。 function < - function(scenario, aaa, bbb。 ccc, ddd, eee) {
方案 <- as. numeric(c(scenario))
aaa <- as. numeric(c(aaa))
bbb <- 作為。 numeric(c(bbb))
ccc <- as. numeric(c(ccc))
ddd <- as. numeric(c(ddd))
eee <- as. numeric(c(eee))
AAA < - seq(aaa,bbb, 1)
BBB <- AAA * ddd
CCC <- AAA * eee
my.table <- data.frame(AAA = AAA,
BBB = BBB,
CCC = CCC)
output.list <- list(scenario = scenario,
aaa = aaa, bbb = bbb。 ccc = ccc, ddd = ddd, eee = eee,
my.table = my.table)
master_output <- do.call(cbind, output.list)
return = list(master_output = master_output)
}
function.output <- apply(master. iter, 1, function(x) {master. function( x[1] 。 x[2] 。 x[3] 。 x[4] 。 x[5] 。 x[/span>6])})
master.df <- do.call("rbind", lapply(function. output, as.data.frame))
colnames(master.df) <- names(function. output[[1]]$master_output)
desired.result <- read.table(text = '
方案 aaa bbb ccc ddd eee my.table.AAA my.table.BBB my.table.CCC
1 1 5 0 20 10 1 20 10
1 1 5 0 20 10 2 40 20
1 1 5 0 20 10 3 60 30
1 1 5 0 20 10 4 80 40
1 1 5 0 20 10 5 100 50
2 1 10 0 2000 1000 1 2000 1000
2 1 10 0 2000 1000 2 4000 2000
2 1 10 0 2000 1000 3 6000 3000
2 1 10 0 2000 1000 4 8000 4000
2 1 10 0 2000 1000 5 10000 5000
2 1 10 0 2000 1000 6 12000 6000
2 1 10 0 2000 1000 7 14000 7000
2 1 10 0 2000 1000 8 16000 8000
2 1 10 0 2000 1000 9 18000 9000
2 1 10 0 2000 1000 10 20000 10000
',頭= TRUE)
這里是我通常用來提交單獨的R檔案到Ubuntucluster的R代碼。 我曾試圖修改下面的R代碼以解決上述問題。 然而,我還沒能得出一個解決方案。
setwd('/home/ubuntu/')
library(doParallel)
detectCores()
my.AWS.n.cores <- detectCores()
registerDoParallel(my.cluster <- makeCluster(my. AWS.n.cores))my.
folderName <- 'R_files_a'
files <- list.files(folderName, full. names=TRUE)。
start.time <- Sys.time()
foreach(file = files, . errorhandling = "remove") %dopar% {>.
source(file)
}
stopCluster(my.cluster)
end.time <- Sys.time()
total.time.c <- end.time-start.time
total.time.c
uj5u.com熱心網友回復:
df <- master.iter
library(doParallel)
ncores <- detectCores()- 1
cl <- parallel::makeCluster(ncores)
registerDoParallel(cl)
v <- foreach(i = 1。 nrow(df) %dopar% {
主人。 function(df[/span>i, 1],df[/span>i。 2] 。 df[i,3] 。 df[i。 4], df[i。 5], df[i。 6])
}
stopCluster(cl)
uj5u.com熱心網友回復:
我們可以使用collapse
library(collapse)
dapply(master. iter, MARGIN = 1。 function(x) {}。
主人。 function( x[1] 。 x[2] 。 x[3] 。 x[4] 。 x[5] 。 x[6])
},并行= TRUE)
輸出
[/span>1] 1 1 1 1 1 1 1 1 1 1 5 5 5 5 5 0 0 0 0 0 20 20 20 20 20 20
[26] 10 10 10 10 10 1 2 3 4 5 20 40 60 80 100 10 20 30 40 50 2 2 2 2 2 2
[51] 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 10 10 10 10 10 10 10 10 10 10 10
[76] 0 0 0 0 0 0 0 0 0 0 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 1000 1000 1000 1000 1000
[101] 1000 1000 1000 1000 1000 1 2 3 4 5 6 7 8 9 10 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000
[126] 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/322191.html
標籤:
