R 仅选择具有特定时差的相关行

R 仅选择具有特定时差的相关行,r,datetime,R,Datetime,以下是我的数据: > str(heard2) 'data.frame': 616 obs. of 3 variables: $ DateTime : POSIXct, format: "2017-07-26 22:28:10" "2017-07-26 22:31:18" "2017-07-26 22:32:18" ... $ Transmitter: int 30759 30759 30759 30759 30759 30759 30759 30759 30759

以下是我的数据:


    > str(heard2)
'data.frame':   616 obs. of  3 variables:
 $ DateTime   : POSIXct, format: "2017-07-26 22:28:10" "2017-07-26 22:31:18" "2017-07-26 22:32:18" ...
 $ Transmitter: int  30759 30759 30759 30759 30759 30759 30759 30759 30759 30759 ...
 $ Station    : Factor w/ 35 levels "TRA1-69","TRA2-69",..: 21 21 21 21 21 22 21 22 21 22 ...

datetime列表示在特定站点检测到发射器的时间。大多数检测间隔为30-60秒或更长时间。如何选择与间隔仅为8秒(或更短)的时间相对应的行?

编辑:原始请求不清楚您是想要较早的记录、较晚的记录还是两个记录。这将生成两条记录。

创建一个变量用于向前检查(
lead
),然后创建一个变量用于向后检查(
lag
)。然后使用
filter
确定您是想要第一个(设置
dist\u lead==8
)、后一个(设置
dist\u lag==8
),还是两者都要(设置
filter(设置
filter(dist\u lead==8 | dist lag==8)


这里有一种使用dplyr的方法。每行
timediff%
安排(日期时间)%>%
变异(
timediff=c(NA_real_,diff(DateTime))
) %>% 

filter(timediff一种方法是交叉连接到表本身,然后根据时间差进行过滤。请注意,这也将返回相同记录的对

    library(dplyr)
    heard2$tmp = 1
    dplyr::full_join(heard2, heard2, by = 'tmp') %>% 
      filter(abs(DateTime.x -DateTime.y) <= 8/60) %>% 
      select(-tmp)
库(dplyr)
听力2$tmp=1
dplyr::完全_连接(heard2,heard2,by='tmp')%>%
过滤器(abs(DateTime.x-DateTime.y)%
选择(-tmp)

如果我做对了,您只需要标记相隔8秒的行,有一个简单的解决方案:

library(tidyverse)

mutate(heard2, Grp = cut(DateTime, '9 sec', F, F)) %>%
  semi_join(count(., Grp) %>% filter(n > 1))

#               DateTime Transmitter Station Grp
# 1  2017-07-26 22:59:10       30759 TRD2-69   6
# 2  2017-07-26 22:59:13       30759 TRD1-69   6
# 3  2017-07-26 23:00:05       30759 TRD2-69  12
# 4  2017-07-26 23:00:08       30759 TRD1-69  12
# 5  2017-07-26 23:00:53       30759 TRD2-69  17
# 6  2017-07-26 23:00:56       30759 TRD1-69  17
# 7  2017-07-26 23:01:45       30759 TRD2-69  23
# 8  2017-07-26 23:01:48       30759 TRD1-69  23
# 9  2017-07-26 23:02:46       30759 TRD2-69  30
# 10 2017-07-26 23:02:49       30759 TRD1-69  30

我们是在计算每个电台还是每个电台发射机组合?@Shree我目前使用的数据实际上仅来自1个发射机。只有在2个以上电台几乎同时听到标签时,才能获得8秒或更短的间隔。因此,我正在查找它们是哪个电台以及这些检测之间的相关时间间隔ns。我认为这很接近。我想以某种方式保留这两个记录,这样我就可以有列:datetime 1、datetime 2、station 1、station 2、time difference。有时一次有两个以上的站点,所以datetime 3/station 3也需要列。
heard2 %>% 
  arrange(DateTime) %>% 
  mutate(
    timediff = c(NA_real_, diff(DateTime))
  ) %>% 
  filter(timediff <= 8 | lead(timediff) <= 8)

              DateTime Transmitter Station timediff
1  2017-07-26 22:59:10       30759 TRD2-69       46
2  2017-07-26 22:59:13       30759 TRD1-69        3
3  2017-07-26 23:00:05       30759 TRD2-69       52
4  2017-07-26 23:00:08       30759 TRD1-69        3
5  2017-07-26 23:00:53       30759 TRD2-69       45
6  2017-07-26 23:00:56       30759 TRD1-69        3
7  2017-07-26 23:01:45       30759 TRD2-69       49
8  2017-07-26 23:01:48       30759 TRD1-69        3
9  2017-07-26 23:02:46       30759 TRD2-69       58
10 2017-07-26 23:02:49       30759 TRD1-69        3
    library(dplyr)
    heard2$tmp = 1
    dplyr::full_join(heard2, heard2, by = 'tmp') %>% 
      filter(abs(DateTime.x -DateTime.y) <= 8/60) %>% 
      select(-tmp)
library(tidyverse)

mutate(heard2, Grp = cut(DateTime, '9 sec', F, F)) %>%
  semi_join(count(., Grp) %>% filter(n > 1))

#               DateTime Transmitter Station Grp
# 1  2017-07-26 22:59:10       30759 TRD2-69   6
# 2  2017-07-26 22:59:13       30759 TRD1-69   6
# 3  2017-07-26 23:00:05       30759 TRD2-69  12
# 4  2017-07-26 23:00:08       30759 TRD1-69  12
# 5  2017-07-26 23:00:53       30759 TRD2-69  17
# 6  2017-07-26 23:00:56       30759 TRD1-69  17
# 7  2017-07-26 23:01:45       30759 TRD2-69  23
# 8  2017-07-26 23:01:48       30759 TRD1-69  23
# 9  2017-07-26 23:02:46       30759 TRD2-69  30
# 10 2017-07-26 23:02:49       30759 TRD1-69  30