使用foreach r对数据帧进行优化和追加



我想通过将嵌套的for循环与foreach包并行化来优化它们。我是这个主题的新手,我尝试了几种方法来将值附加到数据帧中。当for循环返回一个值时,我知道它有问题,但我想将这些值组合起来,并将它们存储到一个数据帧中。我试图用foreach循环替换遍历行的for循环,但我无法使其工作。这样做的目的是为了更好地理解并行化for循环。

library(foreach)
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
df <- data.frame(x=sample(10), y=sample(10), z = sample(10))
repeats <- 2
FUN <- function(df, repeats) {
foreach(k=1:repeats, .combine = 'rbind') %dopar% {
for(i in 1:nrow(df)) {

for(j in 1:ncol(df)) {

c(k=k ,i=i ,j=j , value=df[i, 1] * j )

}
}
} 
}

FUN(df, repeat)
stopCluster(cl)
如前所述,我尝试用foreach替换for循环。同样,这些值没有被正确存储。
foreach(k=1:repeats, .combine = 'rbind') %:% {
foreach(i=1:nrow(df), .combine = 'c') %dopar%{

for(j in 1:ncol(df)) {

c(k=k ,i=i ,j=j , value=df[i, 1] * j )

}
}
} 

输出示例

k i j value
1 1 1 3
1 1 2 6

foreach对于嵌套循环有一个特殊的语法(参见vignette("nested"):

FUN <- function(df, repeats) {

foreach(k=1:repeats, .combine = 'rbind') %:%
foreach(i = 1:nrow(df), .combine = 'rbind') %:%
foreach(j = 1:ncol(df),  .combine = 'rbind') %dopar% {

c(k=k ,i=i ,j=j , value=df[i, 1] * j )

}
}
`rownames<-`(FUN(df, repeats), NULL)

我的输出比你的长,所以我不知道你想要什么。此外,当您提供使用随机数据的示例时,请使用set.seed。所以我们每次都得到相同的结果。

最新更新