2014-06-22 2 views
7

У меня есть код RCpp, где в части кода я пытаюсь преобразовать DataFrame в матрицу. DataFrame имеет только номера (без строк или дат).лучший способ конвертировать DataFrame в матрицу в RCpp

Следующий код работает:

//[[Rcpp::export]] 
NumericMatrix testDFtoNM1(DataFrame x) { 
    int nRows=x.nrows(); 
    NumericMatrix y(nRows,x.size()); 
    for (int i=0; i<x.size();i++) { 
    y(_,i)=NumericVector(x[i]); 
    } 
    return y; 
} 

мне было интересно, если есть альтернативный способ (т.е. эквивалент as.matrix в R) в RCpp делать то же самое, что-то похожее на следующий код ниже (который не делает работа):

//[[Rcpp::export]] 
NumericMatrix testDFtoNM(DataFrame x) { 
    NumericMatrix y(x); 
    return y; 
} 

* EDIT *

Спасибо за ответы. Как предложил Дирк, код C++ примерно в 24 раза быстрее, чем любой из двух ответов, а версия Function на 2% быстрее, чем версия internal::convert_using_rfunction.

Первоначально я искал ответ в RCpp без вызова R. Должно было сделать это ясно, когда я разместил свой вопрос.

+2

Я бы пойти с решением, которое вы имеете в вашем вопросе. Нам может понадобиться лучший способ получить 'n', а также' k' из data.frame (т. Е. Как длина вектора имен). В противном случае это хорошее решение в моем уме, которое мне нравится, а также некоторые из предложенных ответов. –

+0

И я, конечно, ошибался в отношении n и k ретриверов, так как у нас есть '.size()', я в основном думал о функциях с похожими именами с именами для матриц. Может добавить, что в какой-то момент ... –

ответ

6

Подобно версии Габора, вы можете сделать что-то вроде этого:

#include <Rcpp.h> 
using namespace Rcpp ; 

//[[Rcpp::export]] 
NumericMatrix testDFtoNM(DataFrame x) { 
    NumericMatrix y = internal::convert_using_rfunction(x, "as.matrix"); 
    return y; 
} 
6

Если вы не против обратного вызова в R может быть сделано компактно так:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
NumericMatrix DF2mat(DataFrame x) { 
    Function asMatrix("as.matrix"); 
    return asMatrix(x); 
} 

UPDATE комментарий Incorporated Ромен в.

+0

Я бы не стал доверять 'static'' 'Function'. –

+0

Что вы предлагаете? –

+0

Призыв к R стоил. Я бы сделал это на C++. –

Смежные вопросы