子集 DateVector

Subsetting a DateVector

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

考虑到 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*/
                                 );
}')

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

error: invalid user-defined conversion from 'Rcpp::LogicalVector {aka Rcpp::Vector<10, Rcpp::PreserveStorage>}' to 'int' [-fpermissive]

Rcpp::DateVector StDate_sub = StDate[ind]

第二个是:

no known conversion from 'SEXP' to 'int' file585c1863151c.cpp:23:53: error: conversion from 'Rcpp::Date' to non-scalar type 'Rcpp::DateVector {aka Rcpp::oldDateVector}' requested

Rcpp::DateVector EtDate_sub = EtDate[ind];

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

首先,您的示例不是最低限度可重现的,因为没有定义的数据集。

其次,您正在做出(英雄?)假设,即为日期向量定义索引向量赋值。看来它可能不是。

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

#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);
}