我试图从data.frame
中提取并包含包含日期信息的向量。我能够从DateVector
成功提取DataFrame
;但是,我在尝试对数据进行子集时收到错误。
鉴于/* */
子集周围的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*/
);
}')
我收到两个值得注意的错误:
错误:来自&#39; Rcpp :: LogicalVector {aka Rcpp :: Vector&lt; 10,Rcpp :: PreserveStorage&gt;}&#39;的用户定义转换无效到&#39; int&#39; [-fpermissive]
Rcpp :: DateVector StDate_sub = StDate [ind]
第二个是:
没有已知的转换来自SEXP&#39;到&#39; int&#39; file585c1863151c.cpp:23:53:错误:转换自&#39; Rcpp :: Date&#39; to non-scalar type&#39; Rcpp :: DateVector {aka Rcpp :: oldDateVector}&#39;请求的
Rcpp :: DateVector EtDate_sub = EtDate [ind];
我查看了文档,但无法找到方法。对不起,如果我错过了。我在data.frame
中有几个日期变量。我正在使用Rcpp在嵌套for循环中对数据集进行子集化。目前,这花费了太多时间。我无法在data.table
或dplyr
中实现它,因为某些处理需要子集数据集。
答案 0 :(得分:2)
首先,由于没有定义的数据集,您的示例不具有最低可重现性。
其次,您正在制作(英雄?)假设,即为日期向量定义索引向量的赋值。似乎可能不是。
第三,只是循环是微不足道的。修改后的代码如下。毫不费力地构建,不知道它是否运行,因为您没有提供参考数据。
#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);
}