比较R中具有相同日期/组/标识的行之间的时间

问题描述 投票:0回答:1

我的数据框是这样的:

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小时,那么可以保留所有内容。如果时间间隔<1小时,则仅保留Nb_burst最大的行。

这意味着一个数据帧,如:

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个回答
0
投票
我不确定为什么您的组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")
© www.soinside.com 2019 - 2024. All rights reserved.