【问题标题】:Subsetting a DateVector对 DateVector 进行子集化
【发布时间】:2017-04-12 06:59:58
【问题描述】:

我正在尝试从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*/
                                 );
}')

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

错误:从 'Rcpp::LogicalVector {aka Rcpp::Vector}' 到 'int' [-fpermissive] 的用户定义转换无效

Rcpp::DateVector StDate_sub = StDate[ind]

第二个是:

没有从 'SEXP' 到 'int' 的已知转换 file585c1863151c.cpp:23:53:错误:请求从“Rcpp::Date”转换为非标量类型“Rcpp::DateVector {aka Rcpp::oldDateVector}”

Rcpp::DateVector EtDate_sub = EtDate[ind];

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

【问题讨论】:

  • 看起来子集运算符实现在新旧DateVector 实现下都有问题:/

标签: r rcpp


【解决方案1】:

首先,由于没有定义的数据集,因此您的示例不可重现。

其次,您正在做出(英雄?)假设,即为 Date 向量定义索引向量的分配。看来可能不是。

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

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

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 2020-09-18
    • 2014-11-17
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    相关资源
    最近更新 更多