2014-06-22 91 views
7

我有一個RCpp代碼,其中我試圖將一個DataFrame轉換爲Matrix的一部分代碼。 DataFrame只有數字(沒有字符串或日期)。將DataFrame轉換爲RCpp中矩陣的最佳方式

下面的代碼工作:

//[[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

我會去與你的問題,你有解決方案。我們可能需要一個更好的方法來從data.frame中獲得'n'和'k'(即作爲名稱向量的長度)。否則,這是我喜歡的一個很好的解決方案,以及一些建議的答案。 –

+0

我對n和k檢索器當然是錯誤的,因爲我們有'.size()',我主要想到的是與矩陣相似的函數。可以補充說,在某些時候... –

回答

6

到的Gabor的版本類似,你可以做這樣的事情:

#include <Rcpp.h> 
using namespace Rcpp ; 

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

如果你不介意回調至R可以緊湊地做過這樣的:

#include <Rcpp.h> 
using namespace Rcpp; 

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

UPDATE股份有限公司羅曼的評論。

+0

雖然我不會信任'靜態'一個'函數'。 –

+0

你有什麼建議? –

+0

調用R有成本。我會用C++來做。 –