【问题标题】:R cumulative time differenceR 累积时间差
【发布时间】:2020-08-27 03:47:36
【问题描述】:

我想计算从一开始的累积时间差。我编写了一个粗略的解决方案,我并不特别喜欢。有人有可以在 dplyr 管道中使用的更优雅和可靠的解决方案吗?愿望结果应如 diffCum 列中所示。

require(dplyr)

d = data.frame(n = 1:3, t = lubridate::ymd_hms("2020-03-30 08:15:39","2020-03-30 10:15:39","2020-03-30 14:15:39")) %>%
  mutate(diffMin = difftime(t, lag(t,1), unit = "mins")) %>%
  mutate(diffMin = ifelse(is.na(diffMin), 0, diffMin)) %>% # error prone as it would capture other NAs 
  mutate(diffCum = cumsum(diffMin)) # does not work with difftime class

【问题讨论】:

  • 第一次使用lag(t, 1, default = t[1])可以去掉第二个mutate。之后,您可以使用diffCum = cumsum(as.numeric(difftime(t, lag(t, 1, default = t[1]), unit = "mins"))) 使其成为单一变异(如果您不需要diffMin)。
  • (顺便说一句:你应该几乎总是使用library,而不是require。当包不可用时,后者永远不会停止跟踪代码,这几乎不是预期的。参考:@987654321 @)
  • 感谢 r2evans。基本上你和约翰的答案或多或少相似。也会获得“接受”。

标签: r datetime dplyr


【解决方案1】:

我不确定您所说的“捕获其他 NA”是什么意思,我也不确定这是否符合优雅的条件!

d <- 
  data.frame(n = 1:3, t = lubridate::ymd_hms("2020-03-30 08:15:39","2020-03-30 10:15:39","2020-03-30 14:15:39")) %>%
  mutate(
    diffMin = difftime(t, lag(t,1, default = t[1] ), unit = "mins") %>% 
      as.numeric() %>%
      cumsum()
    )

【讨论】:

  • 虽然这是一个很好的尝试,但我总是对嵌套的%&gt;%-pipes 感到畏缩。 *耸耸肩*
  • default = 0 对我有用。有趣的是它没有记录在帮助中。谢谢。
  • Thorsten, dplyr.tidyverse.org/reference/lead-lag.html 显示“默认”作为参数。不过,不要把它误认为stats::lag,不幸的是,这完全不同。 (意识到?lag (a) 可能向您显示 stats::lag,或 (b) 提示您选择哪个包,statsdplyrdata.table。)
  • default=0 逻辑上错了吗?我认为运行差异应始终从 0 开始,但使用 default=0,您的第一个 diffMin 将是 26425936(不是 0)。 (也许我误解了你认为diffMin 应该是什么。)
猜你喜欢
  • 2022-07-24
  • 2022-10-02
  • 2021-12-22
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多