Question

J'ai essayé d'implémenter certaines des fonctions de base de R comme le fractionnement dans Rcpp pour les trames et matrices de données.Pour cela, j'ai besoin de connaître la méthode la plus efficace pour convertir le Data Frame et la Matrix d'avant en arrière.jusqu'à présent, j'utilise le constructeur DataFrame pour convertir la matrice en DataFrame.Comment puis-je reconvertir DataFrame en Matrix. Supposons que toutes les données sont de type double.

L'approche actuelle est

matrice vers DataFrame

NumericMatrix x;
DataFrame y= DataFrame(x);
y.attr("names")=x.attr("names");

DataFrame vers Matrice

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");

Existe-t-il un moyen plus efficace d'effectuer cette conversion ?

Je suis également un débutant sur Rcpp.Quelqu'un peut-il expliquer comment trouver le code source d'une implémentation de classe particulière, par exemple NumericMatrix ?

Aussi la dernière ligne

y.attr("names")=x.attr("names")

ne définit pas les noms de colonnes de x comme noms de colonnes de y.Quelqu'un peut-il expliquer comment définir les noms de colonnes comme noms de colonnes du bloc de données.

Était-ce utile?

La solution

Il te manque le nrow méthode pour DataFrame.Cela pourrait simplifier votre code.Vous n'avez pas besoin du caisson spécial pour la première colonne, etc...

int xsize=x.size();
NumericMatrix y(x.nrows(),xsize);
for(int i=0;i<xsize;i++){
    y(_,i) = NumericVector(x[i]);
}

Quant à la définition des noms de colonnes, vous pouvez passer par le dimnames les attributs:

y.attr("dimnames") = List::create( R_NilValue, x.attr("names") ) ;

Le code source de Matrix est ici mais je ne suis pas sûr que cela va vous aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top