【问题标题】:Speeding up or alternatives to group by and lag in dplyr在 dplyr 中加速或替代 group by 和 lag
【发布时间】:2021-04-15 08:09:46
【问题描述】:

我注意到这个操作对于看似简单的计算来说非常耗时。它可能解释了完成当前 R 脚本的所有持续时间中超过 60% 的时间。

实际数据包含大约500,000 rows 和大约100,000 unique ids(分组依据列)。

用于计算lag difference 的列类型为lubridate::dmy_hms。因此,滞后差异是看seconds 时差。

我认为这些可能是为什么计算需要这么长时间的原因,但我也很好奇我是否可以以不同的方式重写以下代码,或者如果它更快的话,也许只使用R base(可能以牺牲做为代价)一些数据类型体操,以确保其他 dplyr-like 操作保持不变)

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)))

【问题讨论】:

  • 你试过data.table 吗? setDT(dief)[, time_difference := time - shift(time), id]
  • @RonakShah 我不精通 data.table 但我愿意接受该解决方案
  • @RonakShah 我刚刚发现了这个dtplyr 包,也许可以在利用data.table 速度的同时保持相同的dplyr 可读语法?
  • time_diff = diff(time)?
  • @Eyayaw 我认为 diff(time) 与 lag(time) 不同。

标签: r dplyr data-transform


【解决方案1】:

两个选项是 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 基础中的 diff 而不是滞后,mutate. 中使用的函数是否有任何限制。这是更新的代码dief %&gt;% arrange.(id) %&gt;% mutate.(time_difference = diff(time), .by = id)
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2020-07-10
  • 2017-08-24
相关资源
最近更新 更多