2017-04-12 4 views
1

Ich versuche, einen Vektor mit Datumsinformationen aus einer data.frame zu extrahieren und zu unterteilen. Ich bin in der Lage, die DateVector von der DataFrame erfolgreich zu extrahieren; Ich erhalte jedoch einen Fehler, wenn ich versuche, die Daten zu unterteilen.Subsetting eines DateVectors

Die unten funktioniert gut in Anbetracht der /* */ um die DateVector Teilmengen.

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

Es gibt zwei bemerkenswerte Fehler, die ich erhalten:

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

Rcpp::DateVector StDate_sub = StDate[ind]

Das zweite ist:

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];

ich bei der Dokumentation sah, konnte aber nicht einen Weg finden. Entschuldigung, wenn ich es verpasst habe. Ich habe ein paar Datumsvariablen in data.frame. Ich verwende Rcpp, um den Datensatz in einer verschachtelten for-Schleife zu unterteilen. Derzeit dauert es zu viel Zeit. Ich kann es in data.table oder dplyr nicht implementieren, wie der Teilsatzdatensatz für einige Verarbeitung erforderlich ist.

+1

Sieht so aus, als ob die Implementierung des Subset-Operators unter neuen und alten 'DateVector'-Implementierungen problematisch ist: / – coatless

Antwort

2

Zunächst einmal ist Ihr Beispiel nicht minimal reproduzierbar, da es keinen definierten Datensatz gibt.

Zweitens machen Sie die (heroische?) Annahme, dass die Zuweisung durch den Indexvektor für Datumsvektoren definiert ist. Erscheint möglicherweise nicht.

Drittens, nur Schleifen ist trivial. Geänderter Code unten. Erstellt ohne Probleme, keine Ahnung, ob es läuft, da Sie keine Referenzdaten geliefert haben.

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