繁体   English   中英

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

[英]How to convert std::vector<std::vector<double>> to Rcpp::Dataframe or Rcpp::NumericMatrix

我有一个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用户应该能够调用该函数,而不必将结果处理为数据框或矩阵。

一般而言,将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 ;

不过,您可能需要先设置列表的名称,然后再将其设为数据框。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM