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

标签 r dplyr group-by tidyverse summarize

我有一个包含大约 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)左右,但是这个已经在强大的虚拟机上运行了超过24小时。谁能帮助我了解我在这里缺少的东西?我开始怀疑这个管道是否是 O(n^2),通过同时而不是按顺序对用户 ID 和日期进行排序

最佳答案

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

性能不佳是因为 delay 是一个 difftime(正如 OP 在上面的评论中确认的那样)和 difftime不(还)被本地 C 代码支持。作为解决方法,在调用 summarize 之前将 difftime 转换为 numeric

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

关于r - "group_by->summarise->mean()"花费的时间比预期的要长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68293566/

相关文章:

r - 如何展平非原子函数结果,以便可以将其分配为dplyr突变步骤的一部分?

Mysql - 计算按两列分组的排名

r - 如何根据数据框中的分组来增加数字距离?

r - dplyr 中条件的多个组的汇总计数

mysql - 在 MySQL 中使用 GROUP BY 选择最近的行

mysql - 获取Mysql汇总数据

sql - 如何根据 r 中的另一个键/ID 列将列切换为行?

r - 使用 docker 文件安装 R 包

r - 根据R中的查找表填充列

R:如何计算一组内的平均值/标准差,总是逐行相加