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")
In Base R, ohne Lubridate oder irgendetwas anderes (vorausgesetzt, dass Sie TimeStamp in ein POSIXct
-Objekt konvertieren), wie:
Wenn Sie mehrere 1
's haben, müssten Sie diese wie folgt durchlaufen:
So würde ich das mit data.table::foverlaps
Konvertiere zuerst TimeStamp
in ein richtiges POSIXct
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
Dann machen wir das gleiche für df
, stellen aber 10 Minuten Intervalle ein
Dann müssen Sie nur noch foverlaps
und die Untermenge nach übereinstimmenden Inzidenzen
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):
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.
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.
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
...
PS: Verweisen Sie auf die anderen Posts, um TimeStamp
in das POSIXct-Format zu konvertieren.
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.