矢量化方法而不是使用for循环

时间:2017-07-25 09:14:12

标签: r

我有一个数据框' tmp'我需要做的是使用另一个数据帧的最后一行进行计算' SpreadData'。我使用以下代码:

for(i in 1:ncol(tmp)){for(j in 1:nrow(tmp)){PNLData[j,i] = 10*tmp[j,i]*SpreadData[nrow(SpreadData),i]}}

有没有更快的方法使用mapply或其他东西,所以我不需要使用for循环。

由于

1 个答案:

答案 0 :(得分:1)

您可以使用sweep()

PNLData <- sweep(10 * tmp, 2, SpreadData[nrow(SpreadData), ], "*")

PS1:您可以将SpreadData[nrow(SpreadData), ]替换为tail(SpreadData, 1)

PS2:我认为这会产生两份数据。如果你有一个大矩阵,你最好使用Rcpp。

编辑:Rcpp解决方案:将.cpp文件放入并获取源代码。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericMatrix rcppFun(const NumericMatrix& x,
                      const NumericVector& lastCol) {

  int n = x.nrow();
  int m = x.ncol();

  NumericMatrix res(n, m);
  int i, j;

  for (j = 0; j < m; j++) {
    for (i = 0; i < n; i++) {
      res(i, j) = 10 * x(i, j) * lastCol[j];
    }
  }

  return res;
}

在R PNLData <- rcppFun(tmp, SpreadData[nrow(SpreadData), ])中做。