R dplyr中行之间的时差,不同单位

时间:2017-06-05 21:01:13

标签: r datetime dplyr difference

这是我的例子。我正在阅读以下文件: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组)不同。

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

P.S。我无法使用手动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))

产生相同的结果。

2 个答案:

答案 0 :(得分:4)

ts <- ts %>% group_by(MDN) %>% arrange(Cl_Date) %>%
  mutate(time_diff_2 = as.numeric(Cl_Date-lag(Cl_Date), units = 'mins'))

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

答案 1 :(得分:1)

根据@hadley here,解决方案是使用lubridate而不是依赖于基数R。

这类似于:

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