Самый эффективный способ преобразования DataFrame в Matrix и наоборот

Я пытался реализовать некоторые основные функции R, такие как split в Rcpp для фреймов данных и матриц. Для этого мне нужно знать наиболее эффективный метод преобразования Data Frame и Matrix туда-сюда. до сих пор я использую конструктор DataFrame для преобразования матрицы в DataFrame. Как я могу преобразовать DataFrame обратно в матрицу. Предположим, что все данные имеют тип double.

Текущий подход

матрица в DataFrame

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

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

Есть ли более эффективный способ сделать это преобразование?

Также я новичок в Rcpp. Кто-нибудь может объяснить, как найти исходный код конкретной реализации класса, например NumericMatrix?

Также последняя строка

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

не устанавливает имена столбцов x как имена столбцов y. Кто-нибудь может объяснить, как установить имена столбцов в качестве имен столбцов фрейма данных.

0

Решение

Вы скучаете по nrow метод для DataFrame, Это может упростить ваш код. Вам не нужен специальный корпус для первого столбца и т.д …

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

Что касается установки имен столбцов, вы можете пройти через dimnames атрибуты:

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

Исходный код для Matrix является Вот но я не уверен, что это поможет тебе.

2

Другие решения


По вопросам рекламы [email protected]