使用包含索引的IntegrVector子集Rcpp::DateVector?操作员[]过载

Subsetting Rcpp::DateVector using IntegerVector that contains indices? Operator [] overload

本文关键字:DateVector 操作员 过载 Rcpp 包含 索引 子集 IntegrVector      更新时间:2023-10-16

Rcpp用户,

我是Rcpp的新手。我想使用具有整数索引的IntegerVector来子集化DateVector。然而,直接使用[]会导致错误消息:

no viable overloaded operator[] for type 'Rcpp:DateVector'.

下面是一个示例:

在cpp文件-dv.cpp:中

#include < Rcpp.h >
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame subsetDateVector1(DataFrame df) {
  DateVector    dv = df["dv"];
  IntegerVector iv = df["iv"];
  for (int i = 0; i < dv.size(); i++) {
    dv[i] = dv[i] + 7;
  }
  IntegerVector idx = seq_len(2) - 1;
  // DateVector dv1 = dv[idx]; 
  // Q: cannot subset DateVector using IntegerVector? 
  // Any Reason? 
  // How to work around, efficiently?
  // my work around
  Function formatDate("format.Date");
  CharacterVector dvc(dv.size());
  for (int i = 0; i < dv.size(); i++) {
    dvc[i] = as<std::string>(formatDate(wrap(dv[i])));
  }
  CharacterVector dv1 = dvc[idx];
  IntegerVector iv1 = iv[idx];
  return (DataFrame::create(_["dv"] = dv1, _["iv"] = iv1));
}

在R文件-dv.R:

# subsetting Rcpp::DateVector [Ex]
source("dv.cpp")
dv = Sys.Date() + -2:2
iv = 1:5
df = data.frame(dv = dv, iv = iv)
> df
          dv iv
1 2015-12-06  1
2 2015-12-07  2
3 2015-12-08  3
4 2015-12-09  4
5 2015-12-10  5
> subsetDateVector1(df)
          dv iv
1 2015-12-13  1
2 2015-12-14  2

我觉得subsetDateVector1的工作效率不是很高。

DateVector dv1 = dv[idx];没有实施的原因是什么?

有什么有效的方法可以基于索引在DateVector上取子集?

提前感谢。

DateVector和DatetimeVector在Rcpp中有点不同,并且从最早的日子(从RQuantLib访问它们时)开始就存在。它们可能应该被弃用,取而代之的是更好的东西,但我还没有做到这一点。

您可以在NumericVector中使用数字日期(或日期时间)值,这也为您提供了所需的子设置。Rlpapi包有一些例子——本质上,我只是将自epoch以来相当于小数秒的POSIXct放入NumericVector中,然后将其重新分类为POSIXct

最后,如果可以的话,请不要做

  Function formatDate("format.Date");
  CharacterVector dvc(dv.size());
  for (int i = 0; i < dv.size(); i++) {
    dvc[i] = as<std::string>(formatDate(wrap(dv[i])));
  }

您可以用C++很好地格式化日期和时间。这是值得学习的。