Самый эффективный способ преобразования DataFrame в Matrix и наоборот.
Вопрос
Я пытался реализовать некоторые базовые функции R, такие как разделение в Rcpp для кадров и матриц данных.Для этого мне нужно знать наиболее эффективный метод преобразования фрейма данных и матрицы туда и обратно.до сих пор я использую конструктор DataFrame для преобразования матрицы в DataFrame.Как я могу преобразовать DataFrame обратно в Matrix. Предположим, что все данные имеют тип double.
Современный подход
матрица в DataFrame
NumericMatrix x;
DataFrame y= DataFrame(x);
y.attr("names")=x.attr("names");
DataFrame в матрицу
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.Может ли кто-нибудь объяснить, как установить имена столбцов в качестве имен столбцов фрейма данных.
Решение
Вам не хватает 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
является здесь но я не уверен, что это вам поможет.