Moyen le plus efficace de convertir DataFrame en Matrix et vice versa
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.
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.