在 dplyr 中加速或替代分组依据和滞后
Speeding up or alternatives to group by and lag in dplyr
我发现这个看似简单的计算操作非常耗时。它可能解释了完成当前 R 脚本的所有持续时间的 60% 以上。
实际数据包含大约 500,000 rows
和大约 100,000 unique ids
(分组依据列)。
用于计算 lag difference
的列类型是 lubridate::dmy_hms
。因此滞后差是看seconds
时差。
我认为这些可能在计算时间如此长的原因中发挥了作用,但我也很好奇我是否可以以不同的方式重写以下代码,或者如果它更快(可能在做一些数据类型体操以确保其他 dplyr
类操作保持不变的费用)
dief <- tibble(id = rep(letters,4), time = 1:length(id) + sample(1:30, length(id),replace = T))
dief %>%
arrange(id) %>%
group_by(id) %>%
mutate(time_difference = (time - lag(time)))
两个选项是dtplyr和tidytable。我个人使用后者。
两者都利用 data.table 但使用 dplyr 样式代码。
dief <- tibble(id = rep(letters,4), time = 1:length(id) + sample(1:30, length(id),replace = T))
dief %>%
arrange.(id) %>%
mutate.(time_difference = (time - lags.(time)),
.by = id)
这里有一些 speed comparisons。
我发现这个看似简单的计算操作非常耗时。它可能解释了完成当前 R 脚本的所有持续时间的 60% 以上。
实际数据包含大约 500,000 rows
和大约 100,000 unique ids
(分组依据列)。
用于计算 lag difference
的列类型是 lubridate::dmy_hms
。因此滞后差是看seconds
时差。
我认为这些可能在计算时间如此长的原因中发挥了作用,但我也很好奇我是否可以以不同的方式重写以下代码,或者如果它更快(可能在做一些数据类型体操以确保其他 dplyr
类操作保持不变的费用)
dief <- tibble(id = rep(letters,4), time = 1:length(id) + sample(1:30, length(id),replace = T))
dief %>%
arrange(id) %>%
group_by(id) %>%
mutate(time_difference = (time - lag(time)))
两个选项是dtplyr和tidytable。我个人使用后者。 两者都利用 data.table 但使用 dplyr 样式代码。
dief <- tibble(id = rep(letters,4), time = 1:length(id) + sample(1:30, length(id),replace = T))
dief %>%
arrange.(id) %>%
mutate.(time_difference = (time - lags.(time)),
.by = id)
这里有一些 speed comparisons。