在RCpp中将DataFrame转换为Matrix的最佳方法

uda*_*day 9 r rcpp

我有一个RCpp代码,在我试图将DataFrame转换为Matrix的代码的一部分.DataFrame只有数字(没有字符串或日期).

以下代码有效:

//[[Rcpp::export]]
NumericMatrix testDFtoNM1(DataFrame x) {
  int nRows=x.nrows();  
  NumericMatrix y(nRows,x.size());
  for (int i=0; i<x.size();i++) {
    y(_,i)=NumericVector(x[i]);
  }  
  return y;
}
Run Code Online (Sandbox Code Playgroud)

我想知道as.matrix在RCpp中是否有替代方式(即R中的等价物)来做同样的事情,类似于下面的代码(这不起作用):

//[[Rcpp::export]]
NumericMatrix testDFtoNM(DataFrame x) {
  NumericMatrix y(x);  
  return y;
}
Run Code Online (Sandbox Code Playgroud)

*编辑*

谢谢你的回答.正如Dirk所说,C++代码比两个答案中的任何一个快24倍,Function版本比internal::convert_using_rfunction版本快2%.

我最初在没有打电话给R的情况下寻找RCpp的答案.当我发布我的问题时,我应该说清楚.

Rom*_*ois 7

与Gabor的版本类似,你可以这样做:

#include <Rcpp.h>
using namespace Rcpp ;

//[[Rcpp::export]]
NumericMatrix testDFtoNM(DataFrame x) {
  NumericMatrix y = internal::convert_using_rfunction(x, "as.matrix");  
  return y;
}
Run Code Online (Sandbox Code Playgroud)


G. *_*eck 6

如果你不介意回调R,它可以像这样紧凑地完成:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericMatrix DF2mat(DataFrame x) {
    Function asMatrix("as.matrix");
    return asMatrix(x);
}
Run Code Online (Sandbox Code Playgroud)

更新 Romain的评论.