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.

È stato utile?

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à.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top