[英]R: how to split dataframe in foreach %dopar%
這是一個非常簡單的例子。
df = c("already ","miss you","haters","she's cool")
df = data.frame(df)
library(doParallel)
cl = makeCluster(4)
registerDoParallel(cl)
foreach(i = df[1:4,1], .combine = rbind, .packages='tm') %dopar% classification(i)
stopCluster(cl)
在實際情況中,我有n = 400000行的數據幀。 我不知道如何在一個步驟中為每個集群發送nrow / ncluster數據,i =?
我嘗試使用來自庫(itertools)的isplitRows但沒有成功。
您應該嘗試使用索引來創建數據的子集。
foreach(i = nrow(df), .combine = rbind, .packages='tm') %dopar% {
tmp <- df[i, ]
classification(tmp)
}
這將在每次迭代時獲取data.frame
的新行。
此外,您應該注意到foreach循環的結果將寫入新變量。 因此,您應該像這樣分配:
res <- foreach(i = 1:10, .combine = c, ....) %dopar% {
# things you want to do
x <- someFancyFunction()
# the last value will be returned and combined by the .combine function
x
}
嘗試使用Aproach 1中提出的split
和mclapply
的組合: https : mclapply
split
允許您將數據拆分為由因子定義的組,或者如果要單獨對每一行執行操作,則可以使用1:nrow(df)
。
您的意見后我的解決方案:
n = 8 #number of cluster
library(foreach)
library(doParallel)
cl = makeCluster(n)
registerDoParallel(cl)
z = nrow(df)
y = floor(z/n)
x = nrow(df)%%n
ris = foreach(i = split(df[1:(z-x),],rep(1:n,each=y)), .combine = rbind, .packages='tm') %dopar% someFancyFunction(i)
stopCluster(cl)
#sequential
if (x !=0 )
ris = rbind(ris,someFancyFunction(df[(z-x+1):z,1]))
注意:我最后使用了順序執行,因為如果“x”不為零,則函數split將其余行(z-(zx))放在第一個簇中,並更改結果的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.