这是我的例子。我正在阅读以下文件: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))
产生相同的结果。
答案 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)))