"group_by->summarise->mean()" 花费的时间比预期的要长

"group_by->summarise->mean()" taking way longer than expected

我有一个包含大约 420 万个观察值的数据集。我的代码如下:

new_dataframe = original_dataframe %>%
   group_by(user_id, date) %>%
   summarise(delay = mean(delay, na.rm=TRUE)
   )

此管道应采用 420 万 x 3 数据框,其中包含 3 列:user_id、日期、延迟;并输出小于 420 万 x 3 的数据帧。

关于我为什么这样做的一点点,问题涉及用户在给定的到期日付款。有时,用户会在同一到期日以不同的延迟时间进行多次付款(例如,在到期日支付了部分款项,但在几天后完成了其余部分)。我想有一个与每个唯一用户和截止日期组合相关联的延迟度量(平均延迟)。

对于大多数到期日,用户只支付一次,因此 mean 函数本质上应该只是将一个数字从原始数据帧复制到新数据帧。在所有其他情况下,最多有 3 个不同的延迟值与给定的截止日期相关联。

我的理解是这个的时间复杂度应该在O(2n)左右,但是在强大的VM上已经运行超过24小时了.谁能帮助我了解我在这里缺少的东西?我开始怀疑这个管道是否是 O(n^2),通过同时排序用户 ID 和日期而不是顺序排序

我们可以使用data.table方法

library(data.table)
setDT(original_dataframe)[, .(delay = mean(delay, na.rm=TRUE)), by = .(user_id, date)]

或使用collapse

library(collapse)
collap(original_dataframe, delay ~ user_id + date, fmean)

这是由于这个问题:https://github.com/tidyverse/dplyr/issues/5113

性能不佳的原因是 delaydifftime(正如 OP 在上面的评论中确认的那样),并且 difftime(尚)不受支持通过本机 C 代码。作为解决方法,在调用 summarize.

之前将 difftime 转换为 numeric

注意:dplyr github 回购中的上述问题被标记为已关闭只是因为它现在在此处的 vctrs 回购中被跟踪:https://github.com/r-lib/vctrs/issues/1293