"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
性能不佳的原因是 delay
是 difftime
(正如 OP 在上面的评论中确认的那样),并且 difftime
(尚)不受支持通过本机 C 代码。作为解决方法,在调用 summarize
.
之前将 difftime
转换为 numeric
注意:dplyr github 回购中的上述问题被标记为已关闭只是因为它现在在此处的 vctrs 回购中被跟踪:https://github.com/r-lib/vctrs/issues/1293
我有一个包含大约 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
性能不佳的原因是 delay
是 difftime
(正如 OP 在上面的评论中确认的那样),并且 difftime
(尚)不受支持通过本机 C 代码。作为解决方法,在调用 summarize
.
difftime
转换为 numeric
注意:dplyr github 回购中的上述问题被标记为已关闭只是因为它现在在此处的 vctrs 回购中被跟踪:https://github.com/r-lib/vctrs/issues/1293