2014-06-22 3 views
7

Ho un codice RCpp, dove in una parte del codice sto provando a convertire un DataFrame in una Matrix. DataFrame ha solo numeri (senza stringhe o date).il modo migliore per convertire DataFrame in Matrix in RCpp

Il seguente codice funziona:

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

mi chiedevo se c'è modo alternativo (cioè equivalente di as.matrix in R), in RCpp a fare lo stesso, qualcosa di simile al seguente codice qui sotto (che non lavoro):

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

* EDIT *

Grazie per le risposte. Come suggerito da Dirk, il codice C++ è circa 24 volte più veloce di una delle due risposte e la versione Function è del 2% più veloce della versione internal::convert_using_rfunction.

Inizialmente cercavo una risposta all'interno di RCpp senza chiamare R. Dovrei averlo chiarito quando ho postato la mia domanda.

+2

mi piacerebbe andare con la soluzione che avete nella vostra domanda. Potremmo avere bisogno di un modo migliore per ottenere 'n' e anche' k' da data.frame (cioè come lunghezza del vettore dei nomi). Altrimenti è una buona soluzione nella mia mente che mi piace così come alcune delle risposte suggerite. –

+0

E ovviamente avevo sbagliato su n e k retrievers dato che abbiamo '.size()', principalmente pensavo a funzioni con nomi simili a quelli per le matrici. Potrebbe aggiungere che ad un certo punto ... –

risposta

6

Simile alla versione di Gabor, si può fare qualcosa di simile:

#include <Rcpp.h> 
using namespace Rcpp ; 

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

Se non ti dispiace richiamare per R si può fare in questo modo compatto:

#include <Rcpp.h> 
using namespace Rcpp; 

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

UPDATE commento di Incorporated Romain.

+0

Non mi fiderei comunque di 'static' a' Function'. –

+0

Cosa suggerisci? –

+0

La chiamata a R ha un costo. Lo farei in C++. –