如何将 std::vector<std::vector<double>> 转换为 Rcpp::Dataframe 或 Rcpp::NumericMatrix

Posted

技术标签:

【中文标题】如何将 std::vector<std::vector<double>> 转换为 Rcpp::Dataframe 或 Rcpp::NumericMatrix【英文标题】:How to convert std::vector<std::vector<double>> to Rcpp::Dataframe or Rcpp::NumericMatrix 【发布时间】:2014-05-26 07:48:55 【问题描述】:

我有一个std::vector&lt;std::vector&lt;double&gt;&gt;,我想将其转换为Rcpp::DataFrameRcpp::NumericMatrix

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

RcppExport SEXP Foo(...)

    std::vector<std::vector<double>> result;

    /// ... Do some work.

    return Rcpp::wrap(result);

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

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

【问题讨论】:

【参考方案1】:

一般来说,将std::vector&lt;std::vector&lt;double&gt;&gt; 转换为列表是我们能提供的最好的方法。 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 ;

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

【讨论】:

感谢您的建议。我选择了您提供的 NumericMatrix 解决方案。

以上是关于如何将 std::vector<std::vector<double>> 转换为 Rcpp::Dataframe 或 Rcpp::NumericMatrix的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OpenMP 并行化最近邻搜索

C ++中的3 x 3 char向量[关闭]

vector<vector<Point3f>> 中的最大值

释放分配给二维向量的内存

将包含位的字符串转换为向量<bool>

将boost变体的向量过滤成新的向量?