将嵌套for循环转换为R中的foreach?

将嵌套for循环转换为R中的foreach?,r,for-loop,foreach,parallel-processing,dataframe,R,For Loop,Foreach,Parallel Processing,Dataframe,我编写了一个函数,其中包含嵌套在foreach循环中的2个for循环。我有一个数据帧列表,我正试图在:[[5]][10,30]的结构中循环 但是,我尝试使用1000000条路径运行此函数,即I为1:1000000,显然,性能非常糟糕 我真的很想将它与foreach循环并行运行。我发现将任何形式的apply函数与foreach结合使用都不能正常工作。当然,如果有更好的方法,我也希望看到: library(foreach) library(doParallel) # input: matr is

我编写了一个函数,其中包含嵌套在foreach循环中的2个for循环。我有一个数据帧列表,我正试图在:[[5]][10,30]的结构中循环

但是,我尝试使用1000000条路径运行此函数,即I为1:1000000,显然,性能非常糟糕

我真的很想将它与foreach循环并行运行。我发现将任何形式的apply函数与foreach结合使用都不能正常工作。当然,如果有更好的方法,我也希望看到:

library(foreach)
library(doParallel)

# input: matr is a list of 5 matrices
cum_returns <- function(matr) {
  time_horizon <- 30
  paths <- 10
  asset <- 5

  foreach (x = matr) %dopar% {
    for (i in 1:paths) {
      x[i,] <- append(x[i,],100,0)
      for (m in 2:(time_horizon + 1)) {
        # loop through each row of matrix to apply function
        x[i,m] <- x[i,m-1] + x[i,m]
      }
    }
    return(x)
  }
}
对于此格式,通过在每行开头添加100,然后在每行中添加以下值,在每行的字段中创建累积和:

            V1        V2        V3        V4        V5        V6
result.4   100  99.60623 100.02933  99.80099  98.96782  99.75524
result.9   100  98.43197  98.85192  96.69383  98.30565  97.14305
result.4.1 100  99.45047  98.62674  98.98385 100.06133  99.33076
result.9.1 100  99.36764 101.07402 101.73925 102.52408 101.46776
result.4.2 100  99.67572  98.92157  99.66229  97.87457  99.45982
result.9.2 100  99.46517  99.41247 100.92377 101.77289  99.70135
result.4.3 100  99.29867  98.40415  98.13583  97.85983  98.13080
result.9.3 100 101.61878 100.08766 100.78146  99.36566  98.75981
result.4.4 100  99.39305  99.47040 100.23361 101.30958 100.99381
result.9.4 100  99.50548 100.70619 100.54425 100.54328  98.50657

不需要在行和列之间循环。您可以使用R的能力进行矢量化计算,将整列相加,并用对cbind的单个调用替换要追加的重复调用

foreach (x = matr) %dopar% {
  x <- cbind(100,x)
  for (m in 2:(time_horizon + 1)) {
    # loop through each row of matrix to apply function
    x[,m] <- x[,m-1] + x[,m]
  }
  x  
}

即使在我的计算机上不使用多个核,每个矩阵中也有1000000行,这相当快

基于atiretoo的答案,您可以进一步将其矢量化,从而实现简单的并行化。此外,还有一个内置函数来完成您试图在每一行上执行的操作,尽管出于某种原因,我的输出是转置的,必须固定

library(parallel)
mclapply(matr, 
    function (x) {
       x <- cbind(100,x)
       return(t(apply(x,1,cumsum))
    }

通过将apply替换为parrappy,可以进一步并行化。请注意,这些函数仅适用于Linux系统,您需要使用与Windows上并行软件包不同的方法。

我认为循环不需要同时使用这两种方法。只是内部的一个。但是我需要循环遍历数据框中的列和行吗?有没有办法只用一个循环就可以做到这一点呢?我考虑过apply和cumsum,但决定从表面上接受foreach的使用,而apply在其中不起作用。我不得不在我的windows机箱上使用doSNOW。
library(parallel)
mclapply(matr, 
    function (x) {
       x <- cbind(100,x)
       return(t(apply(x,1,cumsum))
    }