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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top