子集DateVector

时间:2017-04-12 06:59:58

标签: r rcpp

我试图从data.frame中提取并包含包含日期信息的向量。我能够从DateVector成功提取DataFrame;但是,我在尝试对数据进行子集时收到错误。

鉴于/* */子集周围的DateVector,以下工作正常。

Rcpp::cppFunction('
Rcpp::DataFrame test(DataFrame x, StringVector y ) {

  StringVector New = x["string_1"];
  std::string KEY = Rcpp::as<std::string>(y[0]);
  Rcpp::LogicalVector ind(New.size());

  for(int i = 0; i < New.size(); i++){
  ind[i] = (New[i] == KEY);
  }


  Rcpp::StringVector st1 = x["string_1"];
  Rcpp::StringVector Id = x["ID"];
  Rcpp::StringVector NameId = x["NameID"];
  Rcpp::DateVector StDate = x["StartDate"];
  Rcpp::DateVector EtDate = x["EndDate"]; 

  /*
  Rcpp::DateVector StDate_sub = StDate[ind];
  Rcpp::DateVector EtDate_sub = EtDate[ind]; 
  */

  return Rcpp::DataFrame::create(Rcpp::Named("string_1") = st1[ind],
                                 Rcpp::Named("ID") = Id[ind],
                                 Rcpp::Named("NameID") = NameId[ind]/*,
                                 Rcpp::Named("StartDate") = StDate_sub,
                                 Rcpp::Named("EndDate") = EtDate_sub*/
                                 );
}')

我收到两个值得注意的错误:

  

错误:来自&#39; Rcpp :: LogicalVector {aka Rcpp :: Vector&lt; 10,Rcpp :: PreserveStorage&gt;}&#39;的用户定义转换无效到&#39; int&#39; [-fpermissive]

     

Rcpp :: DateVector StDate_sub = StDate [ind]

第二个是:

  

没有已知的转换来自SEXP&#39;到&#39; int&#39;   file585c1863151c.cpp:23:53:错误:转换自&#39; Rcpp :: Date&#39; to non-scalar type&#39; Rcpp :: DateVector {aka Rcpp :: oldDateVector}&#39;请求的

     

Rcpp :: DateVector EtDate_sub = EtDate [ind];

我查看了文档,但无法找到方法。对不起,如果我错过了。我在data.frame中有几个日期变量。我正在使用Rcpp在嵌套for循环中对数据集进行子集化。目前,这花费了太多时间。我无法在data.tabledplyr中实现它,因为某些处理需要子集数据集。

1 个答案:

答案 0 :(得分:2)

首先,由于没有定义的数据集,您的示例不具有最低可重现性。

其次,您正在制作(英雄?)假设,即为日期向量定义索引向量的赋值。似乎可能不是。

第三,只是循环是微不足道的。修改后的代码如下。毫不费力地构建,不知道它是否运行,因为您没有提供参考数据

#define RCPP_NEW_DATE_DATETIME_VECTORS 1
#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::DataFrame dftest(DataFrame x, StringVector y ) {

  StringVector New = x["string_1"];
  std::string KEY = Rcpp::as<std::string>(y[0]);
  Rcpp::LogicalVector ind(New.size());

  for(int i = 0; i < New.size(); i++){
    ind[i] = (New[i] == KEY);
  }


  Rcpp::StringVector st1 = x["string_1"];
  Rcpp::StringVector Id = x["ID"];
  Rcpp::StringVector NameId = x["NameID"];
  Rcpp::DateVector StDate = x["StartDate"];
  Rcpp::DateVector EtDate = x["EndDate"]; 

  int n = sum(ind);
  Rcpp::DateVector StDate_sub = StDate(n);
  Rcpp::DateVector EtDate_sub = EtDate(n);
  for (int i=0; i<n; i++) {
    StDate_sub[i] = StDate( ind[i] );
    EtDate_sub[i] = EtDate( ind[i] );
  }

  return Rcpp::DataFrame::create(Rcpp::Named("string_1") = st1[ind],
                                 Rcpp::Named("ID") = Id[ind],
                                 Rcpp::Named("NameID") = NameId[ind],
                                 Rcpp::Named("StartDate") = StDate_sub,
                                 Rcpp::Named("EndDate") = EtDate_sub);
}