Encontre a distância mínima entre dois quadros de dados, para cada elemento no segundo quadro de dados

Eu tenho dois quadros de dados ev1 e ev2, descrevendo carimbos de data e hora de dois tipos de eventos coletados em muitos testes. Portanto, cada quadro de dados possui as colunas "test_id" e "timestamp". O que eu preciso encontrar é a distância mínima de ev1 para cada ev2, no mesmo teste.

Eu tenho um código de trabalho que mescla os dois conjuntos de dados, calcula as distâncias e usa o dplyr para filtrar a distância mínima:

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)))

Enquanto isso funciona, a parte de mesclagem é muito lenta e parece ineficiente - estou gerando uma tabela enorme com todas as combinações de ev2-> ev1 para o mesmo test_id, apenas para filtrá-la para uma. Parece que deve haver uma maneira de "filtrar em tempo real" durante a mesclagem. Existe?

Atualizar: O seguinte caso com duas colunas "agrupar por" falha quando a abordagem data.table descrita por akrun é usada:

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)]

Erro no eval (expr, ambiente, anexo): objeto 'i.time' não encontrado

questionAnswers(2)

yourAnswerToTheQuestion