我有一个数据框' 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循环。
由于
答案 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), ])
中做。