【问题标题】:Compare time between rows with same date/group/id in R比较 R 中具有相同日期/组/ID的行之间的时间
【发布时间】:2020-09-01 05:32:09
【问题描述】:

我的数据框是这样的:

Device_id      Group  Nb_burst            Date_time      
       24          1        3   2018-09-02 10:04:04       
       24          1        5   2018-09-02 10:08:00 
       55          2        3   2018-09-03 10:14:34 
       55          2        7   2018-09-03 10:02:29 
       16          3        2   2018-09-20 08:17:11     
       16          3       71   2018-09-20 06:03:40 
       22          4       10   2018-10-02 11:33:55
       22          4       14   2018-10-02 16:22:18

我想知道,仅对于相同的 ID、相同的组号和相同的日期,两行之间的时间差。

如果时间延迟 > 1 小时,那么可以全部保留。
如果 timelag

这意味着像这样的数据框:

Device_id      Group  Nb_burst            Date_time         
       24          1        5   2018-09-02 10:08:00
       55          2        7   2018-09-03 10:02:29 
       16          3       71   2018-09-20 06:03:40 
       22          4       10   2018-10-02 11:33:55
       22          4       14   2018-10-02 16:22:18

我试过了:

    Data$timelag <- c(NA, difftime(Data$Min_start.time[-1], Data$Min_start.time[-nrow(Data)], units="hours"))

但我不知道只有在 Date、ID 和 Group 相同时如何测试,可能是一个循环。 我的 df 有 1500 行。

希望有人可以帮助我。谢谢 !

【问题讨论】:

标签: r loops time compare rows


【解决方案1】:

我不确定为什么您的群组3 没有重复,因为时差大于一小时。

但是,您可以使用ave 创建两个索引变量。首先,每个分组的Nb_burst 的顺序。其次,每个分组的齿数差异。

dat <- within(dat, {
  score <- ave(Nb_burst, Device_id, Group, as.Date(Date_time), 
               FUN=order)
  thrsh <- abs(ave(as.numeric(Date_time), Device_id, Group, as.Date(Date_time),
                   FUN=diff)/3600) > 1
})

最后是rowSums的子集。

dat[rowSums(dat[c("score", "thrsh")]) > 1,1:4]
#   Device_id Group Nb_burst           Date_time
# 2        24     1        5 2018-09-02 10:08:00
# 3        55     2        7 2018-09-03 10:14:34
# 5        16     3        2 2018-09-20 08:17:11
# 6        16     3       71 2018-09-20 06:03:40
# 7        22     4       10 2018-10-02 11:33:55
# 8        22     4       14 2018-10-02 16:22:18

数据

dat <- structure(list(Device_id = c(24L, 24L, 55L, 55L, 16L, 16L, 22L, 
22L), Group = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L), Nb_burst = c(3L, 
5L, 7L, 3L, 2L, 71L, 10L, 14L), Date_time = structure(c(1535875444, 
1535875680, 1535962474, 1535961749, 1537424231, 1537416220, 1538472835, 
1538490138), class = c("POSIXct", "POSIXt"), tzone = "")), row.names = c(NA, 
-8L), class = "data.frame")

【讨论】:

  • 感谢您的帮助!当我尝试 x[i]
  • 啊,您的Date_time 列可能不是POSIXct 格式。当您事先执行dat$Date_time &lt;- as.POSIXct(dat$Date_time) 时,ist 是否有效?
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 2021-06-20
  • 2017-04-26
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多