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

时间:2014-06-22 14:23:27

标签: 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;
}

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

//[[Rcpp::export]]
NumericMatrix testDFtoNM(DataFrame x) {
  NumericMatrix y(x);  
  return y;
}

*编辑*

感谢您的回答。正如Dirk建议的那样,C ++代码比两个答案中的任何一个快24倍,而Function版本比internal::convert_using_rfunction版本快2%。

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:6)

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

#include <Rcpp.h>
using namespace Rcpp;

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

更新合并了Romain的评论。