如何在RCpp中向数据框添加新列?

时间:2018-08-16 14:07:58

标签: r rcpp

我正在尝试使用RCpp向数据框添加新列。

在以下代码中,我打算在数据框df中添加“结果”列。但是运行代码后,数据集没有“结果”列。你能告诉我他们怎么了吗?

R文件以调用AddNewCol()函数。

library(Rcpp)
sourceCpp('AddNewCol.cpp')
AddNewCol( df ,"result")

AddNewCol.cpp

#include <Rcpp.h>
#include<math.h>
using namespace Rcpp;
// [[Rcpp::export]]
void AddNewCol(DataFrame& df, std::string new_var) {
  int maxRow = df.nrows();
  NumericVector vec_x = df["x"];
  NumericVector vec_y = df["y"];
  NumericVector resultvec = NumericVector(maxRow);

  for( int i = 0 ; i < maxRow; i++ ){
    resultvec[i] = vec_x[i] * pow( vec_y[i] , 2 );  
  }
  df[new_var] = resultvec;
}

1 个答案:

答案 0 :(得分:5)

您不能通过引用来做。但是,如果您返回数据框,它将起作用:

+ AccountsSpectWithMarkup.max: OK, passed 100 tests.
> Collected test data: 
4% (-2147483648,2147483647)
2% (1,2147483647)
2% (-1,-1)
2% (-1,0)
1% (-1,-1128775662)
1% (501893471,-2147483648)
1% (0,0)
1% (1529964222,-1507103054)
1% (36753817,-2147483648)
1% (2147483647,535423354

请注意,我采取了一些自由措施来简化计算。结果:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame AddNewCol(const DataFrame& df, std::string new_var) {
  NumericVector vec_x = df["x"];
  NumericVector vec_y = df["y"];
  df[new_var] = vec_x * Rcpp::pow(vec_y, 2);
  return df;
}

/*** R
set.seed(42)
df <- data.frame(x = runif(10), y = runif(10))
AddNewCol( df ,"result")
*/