如何在R中查找同一时间段内的重复记录

如何在R中查找同一时间段内的重复记录,r,time,duplicates,R,Time,Duplicates,我试图在R中的行为数据的数据框中查找重复记录。我需要查找基于多个列具有相同值且在同一小时内记录的行 N Date Time Observer FocalID 1 20180520 07:05:00 VR JK 2 20180520 07:50:00 VR JK 3 20180521 07:50:00 JD CJD 4 20

我试图在R中的行为数据的数据框中查找重复记录。我需要查找基于多个列具有相同值且在同一小时内记录的行

    N  Date         Time        Observer   FocalID 
    1  20180520     07:05:00    VR         JK
    2  20180520     07:50:00    VR         JK
    3  20180521     07:50:00    JD         CJD
    4  20180521     08:25:00    JD         CJD
例如:下面的第1-2行和第3-4行在Date、Observer和FocalID列中具有相同的值,并且在同一小时内记录

    N  Date         Time        Observer   FocalID 
    1  20180520     07:05:00    VR         JK
    2  20180520     07:50:00    VR         JK
    3  20180521     07:50:00    JD         CJD
    4  20180521     08:25:00    JD         CJD
我已经尝试了以下代码,但它不起作用。一个原因是find_duplicates(hablar包)不接受间隔,而只接受数据帧列

Time <- as.POSIXct (df$Time, format="%H:%M:%S")
span60 <- (Time - minutes(60)) %--% (Time + minutes(60))
df %>% find_duplicates (Date, Observer, FocalID, Time %within% span60)

Time不确定您的预期输出是什么。这里有一种方法可以为每个“副本”提供唯一的
ID

库(dplyr)
df%>%
tidyr::unite(日期时间,日期,时间,九月=”)%>%
突变(DateTime=lubridate::ymd_hms(DateTime))%>%
小组成员(观察员,焦点)%>%
变异(grp=地板(difftime(日期时间,第一个(日期时间),单位为“小时”))%>%
分组依据(grp,.add=TRUE)%>%
变异(ID=cur_group_ID())%>%
解组()%>%
选择(-grp)
#一个tibble:4x5
#N日期时间观察者焦点ID
#                        
#2018-05-20 07:05:00 VR JK 2
#2 2018-05-20 07:50:00 VR JK 2
#3 2018-05-21 07:50:00 JD CJD 1
#4 2018-05-21 08:25:00 JD CJD 1
具有相似ID的所有行都可以视为一个组的一部分

数据

df <- structure(list(N = 1:4, Date = c(20180520L, 20180520L, 20180521L, 
20180521L), Time = c("07:05:00", "07:50:00", "07:50:00", "08:25:00"
), Observer = c("VR", "VR", "JD", "JD"), FocalID = c("JK", "JK", 
"CJD", "CJD")), class = "data.frame", row.names = c(NA, -4L))

df我理解您的问题是试图在
Observer
FocalID
中找到任何具有重复值的行,而它们之间的距离不超过60分钟。
以下解决方案跨日期边界工作:

library(dplyr)
library(purrr)
library(lubridate)

df2 <- df %>%
  group_by(Observer, FocalID) %>%
  mutate(
    dt = as_datetime(paste(Date, Time), tz = "UTC"),
    dt_frame = interval(dt - minutes(60), dt + minutes(60), "UTC"),
    which_duplicates = map(dt_frame, ~N[which(dt %within% .x)], N = N, dt = dt),
    has_duplicates = map_lgl(which_duplicates, ~length(.x) > 1)
  )
库(dplyr)
图书馆(purrr)
图书馆(lubridate)
df2%
小组成员(观察员,焦点)%>%
变异(
dt=as_datetime(粘贴(日期、时间),tz=“UTC”),
dt_帧=间隔(dt-分钟(60),dt+分钟(60),“UTC”),
which_duplicates=map(dt_帧,~N[其中(dt%在%.x内)],N=N,dt=dt),
has_duplicates=map_lgl(哪个_duplicates,~length(.x)>1)
)

如果你不想在午夜将观察结果分组,并将几天分开,只需将
Date
添加到
groupby
语句中。

这有点老套,因为它完全依赖于第一个观察到的时间戳,我认为它只适用于作为示例发布的有限行。而且,你很难突破约会的界限,这是一个很难的假设。。我认为对于每一行,在±60分钟的窗口内的任何其他行都可能是重复的候选行…谢谢!我试过这个,效果很好!看起来它可以在整个数据帧上工作,而不仅仅是以发布的行为例。谢谢!我试过这个,但它说找不到“map”函数。正如你所说,我已经加载了dplyr和lubridate。哦,对不起,我忘了map需要
purr
库。我会把它加在上面。谢谢你的提醒