La forma más eficiente de convertir DataFrame a Matrix y viceversa
Pregunta
He estado intentando implementar algunas de las funciones básicas de R, como dividir en Rcpp para matrices y marcos de datos.Para eso necesito conocer el método más eficiente para convertir Data Frame y Matrix de un lado a otro.Hasta ahora uso el constructor DataFrame para convertir la matriz a DataFrame.¿Cómo puedo convertir DataFrame Back a Matrix? Supongamos que todos los datos son de tipo doble.
El enfoque actual es
matriz a marco de datos
NumericMatrix x;
DataFrame y= DataFrame(x);
y.attr("names")=x.attr("names");
Marco de datos a matriz
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 una forma más eficiente de realizar esta conversión?
También soy un novato en Rcpp.¿Alguien puede explicar cómo encontrar el código fuente de una implementación de clase particular, por ejemplo NumericMatrix?
También la última línea
y.attr("names")=x.attr("names")
no establece los nombres de las columnas de x como nombres de columnas de y.¿Alguien puede explicar cómo configurar los nombres de las columnas como los nombres de las columnas del marco de datos?
Solución
te falta el nrow
método para DataFrame
.Esto podría simplificar su código.No necesitas la carcasa especial para la primera columna, etc...
int xsize=x.size();
NumericMatrix y(x.nrows(),xsize);
for(int i=0;i<xsize;i++){
y(_,i) = NumericVector(x[i]);
}
En cuanto a configurar los nombres de las columnas, puede pasar por el dimnames
atributos:
y.attr("dimnames") = List::create( R_NilValue, x.attr("names") ) ;
El código fuente para Matrix
es aquí pero no estoy seguro de que esto te ayude.