使用包含索引的IntegerVector子集Rcpp :: DateVector?运算符[]重载

时间:2015-12-08 20:34:06

标签: c++ r rcpp

Rcpp用户,

我是Rcpp的新手。我想使用具有整数索引的DateVectorIntegerVector进行子集化。但是,直接使用[]会导致错误消息:

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上获取子集的任何有效方法吗?

感谢您的进步。

1 个答案:

答案 0 :(得分:2)

DateVector和DatetimeVector在Rcpp中稍微分开,并且从最早期(从RQuantLib访问它们)开始存在。它们应该被弃用并被更好的东西所取代,但我还没有达到这一点。

您可以使用NumericVector中的数字日期(或日期时间)值,它还可以为您提供所需的子集。 Rblpapi包中有一些例子---实质上我只是将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 ++中的日期和时间。值得学习的是。