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

StackOverflow https://stackoverflow.com//questions/24012659

  •  21-12-2019
  •  | 
  •  

Вопрос

Я пытался реализовать некоторые базовые функции 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 является здесь но я не уверен, что это вам поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top