Wählen Sie Zeilen innerhalb eines bestimmten Zeitraums aus

7

Ich habe einen Datenrahmen wie:

%Vor%

Ich möchte die Zeitrahmen von + -10 Minuten auswählen, wenn Category "1" ist.

In diesem Fall, weil category = 1 bei 2013-11-02 08:07:25 AM ist, möchte ich alle Zeilen innerhalb von 07:57:25 AM to 08:17:25 AM auswählen.

Was ist der beste Weg, um diese Aufgabe zu bewältigen?

Außerdem gibt es vielleicht mehrere "1" für jeden Zeitrahmen. (Der reale Datenrahmen ist komplizierter, er enthält mehrere Zeitstempel mit verschiedenen Benutzern, d. h. es gibt eine andere Spalte mit der Bezeichnung "Benutzer-ID")

    
zxwjames 24.06.2015, 22:13
quelle

6 Antworten

10

In Base R, ohne Lubridate oder irgendetwas anderes (vorausgesetzt, dass Sie TimeStamp in ein POSIXct -Objekt konvertieren), wie:

%Vor%

Wenn Sie mehrere 1 's haben, müssten Sie diese wie folgt durchlaufen:

%Vor%     
thelatemail 24.06.2015, 23:07
quelle
7

So würde ich das mit data.table::foverlaps

angehen

Konvertiere zuerst TimeStamp in ein richtiges POSIXct

%Vor%

Dann werden wir einen temporären Datensatz erstellen, in dem Category == 1 hinzugefügt werden soll. Wir werden auch eine "Ende" -Spalte und key durch beide "Start" - und "Ende" -Spalten

erstellen %Vor%

Dann machen wir das gleiche für df , stellen aber 10 Minuten Intervalle ein

%Vor%

Dann müssen Sie nur noch foverlaps und die Untermenge nach übereinstimmenden Inzidenzen

ausführen %Vor%     
David Arenburg 24.06.2015 22:48
quelle
4

Verwenden von lubridate:

%Vor%     
Pierre Lafortune 24.06.2015 23:04
quelle
4

Das scheint zu funktionieren:

Daten:

Laut @DavidArenburgs Kommentar (und wie in seiner Antwort erwähnt) ist der richtige Weg, um die Timestamp-Spalte in ein POSIXct -Objekt zu konvertieren (falls nicht schon geschehen):

%Vor%

Lösung:

%Vor%

Ausgabe:

%Vor%

Beachten Sie, dass die Ausgabe bei mehreren Category==1 Zeilen die Ausgabe meiner Funktion eine Liste ist (in diesem Fall hat sie nur ein Element), also wird ein do.call(rbind, pickrows(df)) benötigt, um alles in einer Datenmenge zu kombinieren. Rahmen.

    
LyzandeR 24.06.2015 22:45
quelle
3

Ich persönlich mag die Einfachheit in der Basis R Antwort von @thelatemail. Aber nur zum Spaß, werde ich eine andere Antwort geben mit rollenden Joins in data.table , im Gegensatz zu überlappenden Bereich Joins Lösung von @DavidArenburg bereitgestellt.

%Vor%

Das sollte gut funktionieren, auch wenn Sie mehr als eine Zelle haben, wo Category 1 ist, AFAICT. Es wäre großartig, dies als Feature für diese Art von Operationen für data.table ...

einzubinden

PS: Verweisen Sie auf die anderen Posts, um TimeStamp in das POSIXct-Format zu konvertieren.

    
Arun 24.06.2015 23:18
quelle
1

Hier ist meine Lösung mit dplyr und lubridate . Hier sind die Schritte:

Finde wo category ==1 , füge hinzu, + und - 10 Minuten mit dem lubridate s minutes mit einem einfachen c(-1, 1) * minutes(10) dann mit filter basierend auf den zwei Intervallen, die im rang Vektor gespeichert sind.

%Vor%     
SabDeM 24.06.2015 23:02
quelle

Tags und Links