Modo più efficiente di convertire il frame per matrice e viceversa
Domanda
Ho cercato di implementare alcune delle funzioni di base R come diviso in RCPP per cornici e matrici di dati.Per questo ho bisogno di conoscere il metodo più efficiente di convertire il telaio dei dati e la matrice avanti e indietro.Finora, uso il costruttore di DATAFRAME per convertire la matrice in DataFrame.Come posso convertire DATAFRAME Torna su Matrix.lets Supponiamo che tutti i dati siano di tipo doppia.
L'approccio corrente è
Matrice a DataFrame
NumericMatrix x;
DataFrame y= DataFrame(x);
y.attr("names")=x.attr("names");
.
DataFrame a Matrix
DataFrame x;
int xsize=x.size();
NumericVector col=x(0);
NumericMatrix y(col.size(),xsize);
for(int i=0;i<xsize;i++){
y(_,i)=col;
if(i<xsize-1){
col=x(i+1);
}
}
y.attr("names")=x.attr("names");
.
C'è un modo più efficiente di fare questa conversione?
Inoltre sono un principiante a RCPP.Qualcuno può spiegare come trovare il codice sorgente di una particolare implementazione di classe, ad esempio numericmatrix?
Anche l'ultima riga
y.attr("names")=x.attr("names")
.
non imposta i nomi delle colonne di X come nomi di colonna di Y.Qualcuno può spiegare come impostare i nomi delle colonne come i nomi delle colonne del telaio dei dati.
Soluzione
Manca il metodo nrow
per DataFrame
.Questo potrebbe semplificare il tuo codice.Non hai bisogno del rivestimento speciale per la prima colonna, ecc ...
int xsize=x.size();
NumericMatrix y(x.nrows(),xsize);
for(int i=0;i<xsize;i++){
y(_,i) = NumericVector(x[i]);
}
.
Per quanto riguarda l'impostazione dei nomi delle colonne, è possibile passare attraverso gli attributi dimnames
:
y.attr("dimnames") = List::create( R_NilValue, x.attr("names") ) ;
.
Il codice sorgente per Matrix
è qui Ma non sono sicuro che questo ti aiuterà.