【问题标题】:Time difference between rows in R dplyr, different unitsR dplyr中的行之间的时间差,不同的单位
【发布时间】:2017-11-06 17:45:57
【问题描述】:

这是我的例子。我正在阅读以下文件:sample_data

library(dplyr)

txt <- c('"",  "MDN",                  "Cl_Date"',
          '"1",  "A",  "2017-04-15 15:10:42.510"',
          '"2",  "A",  "2017-04-01 14:47:23.210"',
          '"3",  "A",  "2017-04-01 14:49:54.063"',
          '"4",  "B",  "2017-04-30 13:25:00.000"',
          '"5",  "B",  "2017-04-03 17:53:13.217"',
          '"6",  "B",  "2017-04-15 15:17:43.780"')

ts <- read.csv(text = txt, as.is = TRUE)
ts$Cl_Date <- as.POSIXct(ts$Cl_Date)
ts <- ts %>% group_by(MDN) %>% arrange(Cl_Date) %>%
  mutate(time_diff = c(0,diff(Cl_Date)))
ts <-ts[order(ts$MDN, ts$Cl_Date),]

结果我有

MDN Cl_Date         time_diff
A   4/1/2017 14:47  0
A   4/1/2017 14:49  2.514216665
A   4/15/2017 15:10 20180.80745
B   4/3/2017 17:53  0
B   4/15/2017 15:17 11.89202041
B   4/30/2017 13:25 14.92171551

所以我按 MDN 列分组并计算 Cl_Date 列之间的差异。如您所见,有时会以分钟为单位(A 组),有时以天为单位(B 组)。

为什么不同单位的时差以及如何修正?

附:我无法通过手动创建 data.frame 来重现相同的示例,因此我必须从文件中读取。

更新 1 diff(ts$Cl_Date) 似乎是一致的,一切都在几分钟内。 dplyr 内部有问题吗?

更新 2

ts <- ts %>% group_by(MDN) %>% arrange(Cl_Date) %>%
  mutate(time_diff_2 = Cl_Date-lag(Cl_Date))

产生相同的结果。

【问题讨论】:

  • 你为什么不使用像df &lt;- data.frame(grp = rep(c("a", "b", "c", "d"), each = 3), time = as.POSIXct("2017-06-05 12:00:00") + c(c(0, 1, 11), c(0, 1, 11) * 60, c(0, 1, 11) * 60 * 60, c(0, 1, 11) * 60 * 60 * 24)) 这样易于重现的例子
  • @Henrik 同意,谢谢!现在,这是一个错误吗?我该如何报告 dplyr 的错误?
  • 这不是dplyr 中的错误,而是difftime 的工作原理。我认为帮助文本的相关部分是“如果units = "auto",选择了一组合适的单位,尽可能大的 [...],其中所有绝对差异都大于一个。 "
  • @Henrik,我如何为diff 函数提供单位?
  • @Henrik 另外diff(ts$Cl_Date) 似乎很好,没有有趣的单位选择

标签: r datetime dplyr difference


【解决方案1】:

根据@hadley here 的说法,解决方案是使用 lubridate 而不是依赖基础 R。

这可能是这样的:

ts %>% 
  group_by(MDN) %>% 
  arrange(Cl_Date) %>%
  mutate(as.duration(Cl_Date %--% lag(Cl_Date)))

【讨论】:

    【解决方案2】:
    ts <- ts %>% group_by(MDN) %>% arrange(Cl_Date) %>%
      mutate(time_diff_2 = as.numeric(Cl_Date-lag(Cl_Date), units = 'mins'))
    

    将时间差转换为数值。您可以使用units 参数使返回值保持一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多