Finden Sie den Mindestabstand zwischen zwei Datenrahmen für jedes Element im zweiten Datenrahmen

Ich habe zwei Datenrahmen ev1 und ev2, die Zeitstempel von zwei Ereignistypen beschreiben, die in vielen Tests gesammelt wurden. Jeder Datenrahmen hat also die Spalten "test_id" und "timestamp". Was ich finden muss, ist der Mindestabstand von ev1 für jeden ev2 im selben Test.

Ich habe einen Arbeitscode, der die beiden Datensätze zusammenführt, die Entfernungen berechnet und dann mit dplyr nach der Mindestentfernung filtert:

ev1 = data.frame(test_id = c(0, 0, 0, 1, 1, 1), time=c(1, 2, 3, 2, 3, 4))
ev2 = data.frame(test_id = c(0, 0, 0, 1, 1, 1), time=c(6, 1, 8, 4, 5, 11))

data <- merge(ev2, ev1, by=c("test_id"), suffixes=c(".ev2", ".ev1"))

data$distance <- data$time.ev2 - data$time.ev1

min_data <- data %>%
  group_by(test_id, time.ev2) %>%
  filter(abs(distance) == min(abs(distance)))

Während dies funktioniert, ist der Zusammenführungsteil sehr langsam und fühlt sich ineffizient an. Ich erstelle eine große Tabelle mit allen Kombinationen von ev2-> ev1 für dieselbe test_id, nur um sie auf eine zu filtern. Anscheinend sollte es eine Möglichkeit geben, während der Zusammenführung "on the fly" zu filtern. Gibt es

Aktualisiere: Der folgende Fall mit zwei "Gruppieren nach" -Spalten schlägt fehl, wenn der von akrun beschriebene data.table-Ansatz verwendet wird:

ev1 = data.frame(test_id = c(0, 0, 0, 1, 1, 1), time=c(1, 2, 3, 2, 3, 4), group_id=c(0, 0, 0, 1, 1, 1))
ev2 = data.frame(test_id = c(0, 0, 0, 1, 1, 1), time=c(5, 6, 7, 1, 2, 8), group_id=c(0, 0, 0, 1, 1, 1))
setkey(setDT(ev1), test_id, group_id)
DT <- ev1[ev2, allow.cartesian=TRUE][,distance:=abs(time-i.time)]

Error in eval (expr, envir, enclos): Objekt 'i.time' nicht gefunden

Antworten auf die Frage(4)

Ihre Antwort auf die Frage