我一直在尝试实现一些基本的 R 函数,例如 Rcpp 中数据框和矩阵的 split。为此,我需要知道来回转换数据帧和矩阵的最有效方法。到目前为止,我使用 DataFrame 构造函数将矩阵转换为 DataFrame。如何将 DataFrame 转换回 Matrix。假设所有数据都是 double 类型。

目前的做法是

矩阵到数据帧

NumericMatrix x;
DataFrame y= DataFrame(x);
y.attr("names")=x.attr("names");

数据框到矩阵

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