将NumericVector分配给DataFrame列

时间:2014-07-03 18:45:58

标签: r rcpp

假设我有一个用cfVecCpp编写的工作函数RCpp,它接受​​NumericVector并返回相同长度的NumericVector(且行为正常)。当我尝试将其作为DataFrame元素的循环运行时,我收到错误。

这是我的代码:

#include <Rcpp.h>
#include <algorithm>
using namespace Rcpp;
using namespace std;

//[[Rcpp::export]]
NumericVector cfVecCpp(NumericVector x,int maxfill=-1){
 .... // code works fine here
}

//[[Rcpp::export]]
DataFrame cfDFCpp(DataFrame x, int maxfill=-1) {
  int nRows=x.nrows();
  int nCols=x.size();

  DataFrame z;
  for (int i=0;i<nCols;i++) {
    NumericVector tmp=cfVecCpp(x[i],maxfill);
    // tmp.attr("dim")=Dimension(nRows,1);
    z[i]=wrap(tmp); // alternative z[i]=tmp;
  }
  // z.attr("names")=x.attr("names");
  return z;
}

cfDFCpp函数只是尝试遍历x的列,执行cfVecCpp操作然后返回输出。

代码编译得很好。但是,当我尝试按如下方式在RStudio中运行代码时:

y<-cfDFCpp(x) # where x is data frame whose all columns are numeric

我收到错误:

Error in cfDFCpp(x) : 
  attempt to set index 0/0 in SET_VECTOR_ELT

我尝试提供属性(请参阅注释掉的代码//行),但错误不会消失。可能是什么问题?

我甚至尝试用z[i]=wrap(tmp);替换z[i]=tmp;。代码编译很好,但是当我在RStudio中运行函数时,我得到了相同的错误。

1 个答案:

答案 0 :(得分:2)

如果您创建了空数据框z,则无法设置z[i]。您需要使用push_back()功能。请参阅constructing a Data Frame in Rcpp以了解如何构建数据框。

以下是您问题的答案。

#include <Rcpp.h>
#include <algorithm>
using namespace Rcpp;
using namespace std;

//[[Rcpp::export]]
NumericVector cfVecCpp(NumericVector x,int maxfill=-1){
  return(x * 2);
}

//[[Rcpp::export]]
DataFrame cfDFCpp(DataFrame x, int maxfill=-1) {
  int nCols =x.length();
  List zlist(nCols);

  for (int i=0;i<nCols;i++) {
    zlist[i] =cfVecCpp(x[i],maxfill);
  }
  zlist.attr("names") = x.attr("names");
  DataFrame z(zlist); // convert list to DataFrame
  z.attr("row.names") = x.attr("row.names");
  return z;
}

然后在成功运行sourceCpp之后在R中执行

> data(freeny)

> tail(freeny, 2)
              y lag.quarterly.revenue price.index income.level
1971.5  9.77536               9.74924     4.27839      6.19377
1971.75 9.79424               9.77536     4.27789      6.20030
        market.potential
1971.5           13.1625
1971.75          13.1664
> tail(cfDFCpp(freeny), 2)
               y lag.quarterly.revenue price.index income.level
1971.5  19.55072              19.49848     8.55678     12.38754
1971.75 19.58848              19.55072     8.55578     12.40060
        market.potential
1971.5           26.3250
1971.75          26.3328