如何转换std :: vector <std :: vector <double>&gt;到Rcpp :: Dataframe或Rcpp :: NumericMatrix </std :: vector <double>

时间:2014-05-26 07:48:56

标签: c++ r rcpp

我有一个std::vector<std::vector<double>>,我希望将其转换为Rcpp::DataFrameRcpp::NumericMatrix

我目前的解决方案看起来像这样,并且远非理想;它产生了一个数字列表。

RcppExport SEXP Foo(...)
{
    std::vector<std::vector<double>> result;

    /// ... Do some work.

    return Rcpp::wrap(result);
}

注意事项:不会修复列数和行数。在每次运行之间,这些可以改变我之所以提到这一点,是因为到目前为止我找到的许多解决方案都涉及在编译时知道列。

如果可能的话,我希望解决方案完全包含在c ++中;即R用户应该能够调用该函数,而不必将结果处理成数据帧或矩阵。

1 个答案:

答案 0 :(得分:6)

std::vector<std::vector<double>>转换为列表是我们一般可以提供的最佳选择。 DataFrame要求所有列具有相同的长度。

你必须自己手动处理。像这样做一个矩阵:

std::vector<std::vector<double>> result ;
int nc = result.size(), nr = result[0].size() ;
NumericMatrix m( nr, nc ) ;
for( int j=0; j<nc; j++){
    std::vector<double>& result_j ;
    if( result_j.size() != nr ) stop( "incompatible size" ) ;
    for( int i=0; i<nr; i++){
        m(i,j) = result_j[i] ;
    }
}

直接制作DataFrame有点困难,我建议先制作一个列表,然后将此列表转换为DataFrame

List list( nc ) ;
for( int j=0; j<nc; j++) list[j] = wrap( result[j].begin(), result[j].end() ) ;
DataFrame df = list ;

您可能需要在将列表设置为数据框之前设置列表的名称。