我有两个数据框ev1和ev2,描述了在许多测试中收集的两种事件的时间戳。因此,每个数据框都有“test_id”和“timestamp”列。我需要找到每个相同测试中ev1与ev2之间的最小时间距离。
我有一段可行的代码,它合并了这两个数据集,计算了距离,然后使用dplyr过滤最小距离:
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)))
虽然这样做可以实现功能,但合并部分非常缓慢,效率低下--我会生成一个包含所有ev2->ev1组合的巨大表格,只为了将其过滤到一个。似乎应该有一种方法在合并过程中“实时过滤”。有吗?
更新:当使用akrun提供的data.table方法时,下面有两个“group by”列的情况会失败:
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)]
在计算(expr, envir, enclos)时出错:对象“i.time”未找到
left_join(ev2,ev1, by=c("test_id") )
而不是merge
吗? - Khashaadata.table
方法吗?它应该非常快速。 - akrundplyr
中merge(., all.x=TRUE)
的类比。 - Khashaa