我有两个数据框如下:
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)
感谢您的帮助。感谢
答案 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
为读者练习: