更高效的R函数,可累积先前结果

时间:2015-04-23 15:33:58

标签: r

我有两个数据框如下:

totPrimas:

54 54 54 ...
54 56 55 ...
54 56 55 ...
...

and a:

0.998 0.988 0.958 ...
0.997 0.978 0.958 ...
0.995 0.878 0.948 ...
...

我想将第一行的totPrimas *第一行乘以a。 totPrimas [1,] * a [1,]加上totPrimas [2,]的结果我想乘以[2,]等等。

我写了一个函数但速度很慢,真正的数据框是564,20000。

b<- matrix(0, nrow = 10, ncol = 10)
b<- as.data.frame(b)


        prova3 <- function(i){

        if(i==1){
        b[1,] <<- totPrimas[i,]*a[i,]

        }else{

        b[i,] <<- (b[i-1,] + totPrimas[i,])*a[i,]
        }

        }

    sapply(1:10, prova3)

感谢您的帮助。感谢

1 个答案:

答案 0 :(得分:3)

totPrimas <- read.table(text = "54 54 54
54 56 55
54 56 55")

a <- read.table(text = "0.998 0.988 0.958
0.997 0.978 0.958
0.995 0.878 0.948")

您的代码的结果:

#   [,1]   [,2]     [,3]    
#V1 53.892 107.5683 160.7605
#V2 53.352 106.9463 143.0668
#V3 51.732 102.2493 149.0723

让我们对Rcpp做一个简单的翻译:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector fun(const NumericVector x, const NumericVector y) {
  NumericVector z(x.size());
  z(0) = x(0) * y(0);
   for(int i = 1; i < x.size(); i++) {
     z(i) = (z(i-1) + x(i)) * y(i);
   }
   return z;
}

(如果使用RStudio,可以简单地创建一个新的&#34; C ++文件&#34 ;,将代码复制到它,并点击&#34;来源&#34 ;.当然,你需要安装RCPP包,如果你使用Windows,你需要Rtools。)

然后在R中,你可以像这样遍历列:

t(mapply(fun, x = totPrimas, y = a))
#     [,1]     [,2]     [,3]
#V1 53.892 107.5683 160.7605
#V2 53.352 106.9463 143.0668
#V3 51.732 102.2493 149.0723

为读者练习:

  1. 循环Rcpp中的列。
  2. 使用递归。