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

3

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

在下面的代码中,我想向数据框df中添加一个"result"列。但是运行代码后,数据集中没有"result"列。你能告诉我代码哪里出了问题吗?

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个回答

6

你不能通过引用来实现它。但是如果返回数据框,它就可以工作:

#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")
*/

请注意,我已经稍微简化了计算过程。结果如下:
> set.seed(42)

> df <- data.frame(x = runif(10), y = runif(10))

> AddNewCol( df ,"result")
           x         y      result
1  0.9148060 0.4577418 0.191677054
2  0.9370754 0.7191123 0.484582715
3  0.2861395 0.9346722 0.249974991
4  0.8304476 0.2554288 0.054181629
5  0.6417455 0.4622928 0.137150421
6  0.5190959 0.9400145 0.458687354
7  0.7365883 0.9782264 0.704861206
8  0.1346666 0.1174874 0.001858841
9  0.6569923 0.4749971 0.148232064
10 0.7050648 0.5603327 0.221371155

1
@toshi-san,请看一下data.table正在做什么。 - Ralf Stubner
3
@toshi-san 关于为什么会这样,您可能会对这个相关问题的两个答案感兴趣:https://dev59.com/_2Uo5IYBdhLWcg3w1yTH。 - duckmayr
@duckmayr,你提供的相关问题增进了我的理解。谢谢! - toshi-san
@RalfStubner,实际上我已经阅读了由@duckmay提供的链接。据我理解,虽然DataFrame&通常意味着“按引用调用”,但在向数据框添加列时,它会悄悄地进行复制,因为它仅是向量列表,无法调整大小。然而,他们没有解释为什么在这种情况下const限定符有帮助。 - nalzok
@nalzok 在这种情况下,“conts”限定符并不重要。 - Ralf Stubner
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接