Effizienteste Möglichkeit, DataFrame in Matrix und umgekehrt zu konvertieren
Frage
Ich habe versucht, einige der grundlegenden R-Funktionen wie Split in Rcpp für Datenrahmen und Matrizen zu implementieren.Dazu muss ich die effizienteste Methode zum Hin- und Herkonvertieren von Datenrahmen und Matrix kennen.Bisher verwende ich den DataFrame-Konstruktor, um die Matrix in DataFrame zu konvertieren.Wie kann ich DataFrame zurück in Matrix konvertieren? Nehmen wir an, dass alle Daten vom Typ Double sind.
Der aktuelle Ansatz ist
Matrix zu DataFrame
NumericMatrix x;
DataFrame y= DataFrame(x);
y.attr("names")=x.attr("names");
DataFrame zu 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");
Gibt es eine effizientere Möglichkeit, diese Konvertierung durchzuführen?
Außerdem bin ich ein Neuling bei Rcpp.Kann jemand erklären, wie man den Quellcode einer bestimmten Klassenimplementierung findet, zum Beispiel NumericMatrix?
Auch die letzte Zeile
y.attr("names")=x.attr("names")
legt die Spaltennamen von x nicht als Spaltennamen von y fest.Kann jemand erklären, wie man die Spaltennamen als Spaltennamen des Datenrahmens festlegt?
Lösung
Dir fehlt das nrow
Methode für DataFrame
.Dies könnte Ihren Code vereinfachen.Sie benötigen kein spezielles Gehäuse für die erste Säule usw.
int xsize=x.size();
NumericMatrix y(x.nrows(),xsize);
for(int i=0;i<xsize;i++){
y(_,i) = NumericVector(x[i]);
}
Zum Festlegen der Spaltennamen können Sie Folgendes durchgehen dimnames
Attribute:
y.attr("dimnames") = List::create( R_NilValue, x.attr("names") ) ;
Der Quellcode für Matrix
Ist Hier aber ich bin mir nicht sicher, ob dir das helfen wird.