代码之家  ›  专栏  ›  技术社区  ›  MichaelE

如何在Rcpp中根据日期和时间来子集Xts矩阵?

r
  •  0
  • MichaelE  · 技术社区  · 4 年前

    鉴于以下基本数据:

    x <- xts(1:1000, as.Date("2000-01-01")+1:1000)
    head(x)
               [,1]
    2000-01-02    1
    2000-01-03    2
    2000-01-04    3
    2000-01-05    4
    2000-01-06    5
    2000-01-07    6
    

    x.subset <- x["2000-02-05 00:00:00/2000-03-10 00:00:00"]
    head(x.subset)
               [,1]
    2000-02-05   35
    2000-02-06   36
    2000-02-07   37
    2000-02-08   38
    2000-02-09   39
    2000-02-10   40
    

    问题是如何在Rcpp中直接进行这种类型的子集设置?

    // [[Rcpp::export]]
    RObject subsetRcpp(const Rcpp::NumericMatrix& x)
    {
      return wrap(x(1,_));
    }
    

    return wrap(x(_,0));
    

    返回整个向量或列,但我最大的问题是,它只包含数据并剥离XTS索引和其他属性。我期待的是 x[,1] 在R。

    返回换行符(x(y.begin(),y.end()); 我有一个编译错误,例如: no match for call to '(Const NumericMAtrix {aka const Rcpp::Matrix,14.}) (Rcpp::Range, Rcpp::Range)' no match for call to '(Const NumericMAtrix {aka const Rcpp::Matrix,14.}) (Rcpp::const_iterator, Rcpp::const_iterator)'

    return wrap(x(0, 5)); 它可以编译,但R在运行时崩溃。

    我一直无法找到任何代码样本,我可以得到预期的工作。

    所以我现在有了一个更简单的目标。我正在尝试用Rcpp复制以下基本R命令:

    x[1,]
               [,1]
    2000-01-02    1
    x[,1]  # The entire column.
    x[1:5,1:1]
               [,1]
    2000-01-02    1
    2000-01-03    2
    2000-01-04    3
    2000-01-05    4
    2000-01-06    5
    

    日期和其他xts属性保持不变。

    1 回复  |  直到 4 年前
        1
  •  0
  •   Dirk is no longer here    4 年前

    你不容易因为 "2000-02-05 00:00:00/2000-03-10 00:00:00" 是在相当广泛的范围内完成的 xts

    但不要害怕。你仍然可以解析日期,找到一个开始和结束,并用它来定义子集。我最常做的是处理时间戳 POSIXct (或 Rcpp::Datetime )作为数值变量,并传递 “索引”列也向下显示为数字。

    还有一个C级接口 ,我最近更新了 the header file defining it 在公共关系中。