Ich habe 2-Datenrahmen:Wie Zeilen aus einer Datentabelle zu entfernen, basierend auf einem Zustand in einen anderen Datentabelle
master = data.table(MasterTimes= as.POSIXct("2015-01-01", tz = "GMT") + seq(1,100,1))
mydata = data.frame(MyTimes = as.POSIXct(c("2015-01-01 00:00:18","2015-01-01 00:00:54","2015-01-01 00:00:48","2015-01-01 00:01:10","2015-01-01 00:01:05"),tz = "GMT"))
Ich würde innerhalb von +/- 5 Sekunden Fenster in Master alle Zeilen halten möchten jede Zeit im mydata
Datenrahmen. Ich möchte die Zeilen in master
entfernen, die diese Bedingung nicht erfüllen.
Hier ist ein einfacheres Beispiel, wenn mydata
nur 1 Reihen hat:
master = data.table(MasterTimes= as.POSIXct("2015-01-01", tz = "GMT") + seq(1,100,1))
mydata = data.frame(MyTimes = as.POSIXct(c("2015-01-01 00:00:18"),tz = "GMT"))
können Sie sehen mydata
enthält nur "2015-01-01 00:00:18"
. In diesem Fall möchte ich alle Zeilen aus dem Stammdatenrahmen entfernen, wo die Zeit nicht innerhalb der + ist - 5 Sekunden Fenster dh ich alle Zeilen aus master
vor "2015-01-01 00:00:13"
und nach "2015-01-01 00:00:23"
Das ist der einfache Fall entfernen möge aber ein schwieriger Fall ist, wenn mydata
mydata = data.frame(MyTimes = as.POSIXct(c("2015-01-01 00:00:18", "2015-01-01 00:00:22"),tz = "GMT"))
in diesem Fall enthält, weil "2015-01-01 00:00:18"
wieder würde ich normalerweise alle Zeilen in Master vor "2015-01-01 00:00:13"
und nach "2015-01-01 00:00:23"
entfernen.
Aber in diesem Fall kann ich das nicht tun, weil mydata
auch "2015-01-01 00:00:22"
so wollen I enthält in master
nach "2015-01-01 00:00:18"
alle Zeilen halten und vor "2015-01-01 00:00:27"
Da "2015-01-01 00:00:22"
in meine Daten muss ich jetzt die halten in Master Reihen von "2015-01-01 00:00:23"
zu "2015-01-01 00:00:27"
Grundsätzlich mag ich jede Zeile im Master halten, die in mydata
innerhalb eines +/- 5 Sekunden-Fenster von jeder Reihe ist. Wenn es Zeilen im Master gibt, die nicht innerhalb eines 5 Sekunden Fensters sind, möchte ich es löschen.
aktualisieren
Können Sie beraten, wie dies zu implementieren, wenn master
und mydata
mehr als 1 Spalte haben wie:
master = data.table(MasterTimes= as.POSIXct("2015-01-01", tz = "GMT") + seq(1,100,1), otherol = seq(1,100,1))
mydata = data.frame(MyTimes = as.POSIXct(c("2015-01-01 00:00:18"),tz = "GMT"),othercol = c(1))
In Wirklichkeit beide Master und mydata haben 50+ Spalten.
Ich denke, dass 'master [rowSums (abs (Außen (Master $ MasterTimes, mydata $ MyTimes, difftime, Einheiten = "sec")) <=5)> 0]' könnte ein Weg sein, aber es skaliert nicht gut und sicherlich bessere Lösungen existieren. – nicola