2017-04-12 4 views
1

data.frameから日付情報を含むベクトルを抽出し、サブセット化しようとしています。 DataFrameからDateVectorを正常に抽出できます。ただし、データをサブセット化しようとするとエラーが発生します。DateVectorのサブセット

サブセットを中心に/* */が指定されていると、以下の問題は解決します。

error: invalid user-defined conversion from 'Rcpp::LogicalVector {aka Rcpp::Vector<10, Rcpp::PreserveStorage>}' to 'int' [-fpermissive]

Rcpp::DateVector StDate_sub = StDate[ind]

秒です:私はドキュメントを見て、しかし、方法を見つけることができませんでした

no known conversion from 'SEXP' to 'int' file585c1863151c.cpp:23:53: error: conversion from 'Rcpp::Date' to non-scalar type 'Rcpp::DateVector {aka Rcpp::oldDateVector}' requested

Rcpp::DateVector EtDate_sub = EtDate[ind];

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*/ 
           ); 
}') 

は、私が受け取る2個の顕著なエラーがあります。申し訳ありませんが、もし私がそれを逃した。私はdata.frameにいくつかの日付変数を持っています。私はRcppを使ってネストされたforループのデータセットをサブセット化しています。現在、時間がかかりすぎています。私はdata.tableまたはdplyrに実装することはできません。サブセットのデータセットは処理が必要なためです。

+1

サブセット演算子の実装のように見えるのは、新旧両方の 'DateVector'実装の両方で問題になります。/ – coatless

答えて

2

最初にオフにすると、定義されたデータセットがないため、例は最小限に再現できません。

第2に、インデックスベクトルによる割り当てを日付ベクトルに定義するという(英雄的な)仮定をしています。それがそうでないかもしれないと思われる。

第3に、ループは単純です。下記の改訂コード。あなたが参照データを提供していないので、それがを実行するかどうかは分かりません。

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