Angenommen, ich habe einen Datenrahmen mit einer Reihe von Daten und einer Datums-/Zeitspalte, die angibt, wann jeder Datenpunkt gesammelt wurde. Ich habe einen anderen Datenrahmen, der die Zeitspannen auflistet, wobei eine "Start" -Spalte das Datum/die Zeit angibt, wann jeder Bereich beginnt und eine "Ende" -Spalte das Datum/die Zeit anzeigt, wann jeder Bereich endet.Effiziente Möglichkeit, einen Datenrahmen nach Bereichen in einem anderen zu filtern
Ich habe ein Dummy-Beispiel unter Verwendung von vereinfachten Daten erstellt:
main_data = data.frame(Day=c(1:30))
spans_to_filter =
data.frame(Span_number = c(1:6),
Start = c(2,7,1,15,12,23),
End = c(5,10,4,18,15,26))
ich um dieses Problem zu lösen mit ein paar Möglichkeiten gespielt und endete mit der folgenden Lösung:
require(dplyr)
filtered.main_data =
main_data %>%
rowwise() %>%
mutate(present = any(Day >= spans_to_filter$Start & Day <= spans_to_filter$End)) %>%
filter(present) %>%
data.frame()
Diese funktioniert einwandfrei, aber mir ist aufgefallen, dass es eine Weile dauern kann, bis ich eine Menge Daten verarbeitet habe (ich nehme an, weil ich einen zeilenweisen Vergleich durchführe). Ich lerne immer noch das Hin und Her von R und ich frage mich, ob es eine effizientere Art der Durchführung dieser Operation gibt, vorzugsweise mit dplyr/tidyr?
Dies wird viel schneller als die angenommene Antwort, wenn die Nachschlagetabelle wächst. – eddi
Verbesserungen wurden kürzlich vorgenommen ..sollte auch bei kleineren Lookup-Tabellen schneller sein. – Arun