使用 foreach R 优化并将值附加到数据框
Optimize and append values to dataframe with foreach R
我想通过将它们与 foreach 包并行化来优化我的嵌套 for 循环。我是这个主题的新手,我尝试了几种方法将值附加到数据框。我知道 for 循环有些问题,因为它 returns 是一个值,但我想组合这些值并将它们存储到数据框中。我试图用 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。所以我们每次都得到相同的结果。
我想通过将它们与 foreach 包并行化来优化我的嵌套 for 循环。我是这个主题的新手,我尝试了几种方法将值附加到数据框。我知道 for 循环有些问题,因为它 returns 是一个值,但我想组合这些值并将它们存储到数据框中。我试图用 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。所以我们每次都得到相同的结果。