gpt4 book ai didi

r - 对于第二个数据帧中的每个元素,求两个数据帧之间的最小距离

转载 作者:行者123 更新时间:2023-12-04 18:40:20 27 4
gpt4 key购买 nike

我有两个数据帧 ev1 和 ev2,描述了在许多测试中收集的两种类型事件的时间戳。因此,每个数据框都有“test_id”和“timestamp”列。我需要找到的是在同一个测试中每个 ev2 的 ev1 的最小距离。

我有一个合并两个数据集的工作代码,计算距离,然后使用 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 的所有组合,用于相同的 test_id,只是为了将其过滤为一个。在合并期间,似乎应该有一种“即时过滤”的方法。在那儿?

更新 :当使用 akrun 概述的 data.table 方法时,以下具有两个“分组依据”列的情况失败:
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)]

eval(expr,envir,enclos)中的错误:找不到对象“i.time”

最佳答案

这是我如何使用 data.table 做到这一点:

require(data.table)
setkey(setDT(ev1), test_id)
ev1[ev2, .(ev2.time = i.time, ev1.time = time[which.min(abs(i.time - time))]), by = .EACHI]
# test_id ev2.time ev1.time
# 1: 0 6 3
# 2: 0 1 1
# 3: 0 8 3
# 4: 1 4 4
# 5: 1 5 4
# 6: 1 11 4

x[i]data.table 形式的连接中,前缀 i. 用于引用 i 中的列,当 xi 共享特定列的相同名称时。

请参阅 this SO post 以了解其工作原理。

这在语法上更容易理解正在发生的事情,并且内存效率高(以很少的速度为代价1),因为它根本没有实现整个连接结果。事实上,这正是您在帖子中所说的 - 在合并时即时过滤。
  • 关于速度,在大多数情况下真的无关紧要。如果 i 中有很多行,它可能会慢一点,因为必须为 j 中的每一行计算 i 表达式。相比之下,@akrun 的回答进行了笛卡尔连接,然后进行了一次过滤。因此,虽然它的内存很高,但它不会为 j 中的每一行评估 i 。但同样,这甚至无关紧要,除非您使用非常大的 i,但这种情况并不常见。

  • HTH

    关于r - 对于第二个数据帧中的每个元素,求两个数据帧之间的最小距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27466284/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com