具有相同列的两个数据帧,如果列时间在R中的24小时内,则子集为一

具有相同列的两个数据帧,如果列时间在R中的24小时内,则子集为一,r,time,datatable,subset,R,Time,Datatable,Subset,我有两个具有相同变量标题的数据帧,如果一个人的名字中有匹配项,并且他们的订购时间小于24小时,我想将df1子集为df2 Name <- c("MCCARTNEY, PAUL", "STARR, RNGO", "HARRISON, GEORGE", "LENNON, JOHN") Order_TM <-c("3/4/2020 15:16", "3/4/2020 15:16", "3/4/2020 15:16","3/4/2020 19:30") df1 <-data.frame(

我有两个具有相同变量标题的数据帧,如果一个人的名字中有匹配项,并且他们的订购时间小于24小时,我想将df1子集为df2

Name <- c("MCCARTNEY, PAUL", "STARR, RNGO", "HARRISON, GEORGE", "LENNON, JOHN")
Order_TM <-c("3/4/2020 15:16", "3/4/2020 15:16", "3/4/2020 15:16","3/4/2020 19:30")
df1 <-data.frame(Name, Order_TM)
Name
#将数据帧转换为data.tables
库(数据表)
setDT(df1)
setDT(df2)
#将Order_TM转换为日期时间格式
df1[,Order_TM:=as.POSIXct(Order_TM,格式='%m/%d/%Y%R')]
df2[,Order_TM:=as.POSIXct(Order_TM,格式='%m/%d/%Y%R')]
#联接以查找日期时间之间的小时差异
df1[df2,on=(名称),time_diff:=abs(difftime(即Order_TM,Order_TM,'hours'))]
#基于时差的子集
df1[时间差<24]
#名称顺序时间差异
#1:MCCARTNEY,PAUL 2020-03-04 15:16:00 3.0小时
#2:STARR,RNGO 2020-03-04 15:16:00 5.0小时
#约翰·列侬2020-03-04 19:30:00 16.5小时
#将数据帧转换为数据表
库(数据表)
setDT(df1)
setDT(df2)
#将Order_TM转换为日期时间格式
df1[,Order_TM:=as.POSIXct(Order_TM,格式='%m/%d/%Y%R')]
df2[,Order_TM:=as.POSIXct(Order_TM,格式='%m/%d/%Y%R')]
#联接以查找日期时间之间的小时差异
df1[df2,on=(名称),time_diff:=abs(difftime(即Order_TM,Order_TM,'hours'))]
#基于时差的子集
df1[时间差<24]
#名称顺序时间差异
#1:MCCARTNEY,PAUL 2020-03-04 15:16:00 3.0小时
#2:STARR,RNGO 2020-03-04 15:16:00 5.0小时
#约翰·列侬2020-03-04 19:30:00 16.5小时

如果您喜欢
dplyr
解决方案,您可以尝试以下方法:

library(dplyr)
library(lubridate)
df1 %>% 
  left_join(df2,by = "Name") %>%
  mutate(Order_TM = Order_TM.x, TimeDiff = mdy_hm(Order_TM.x) - mdy_hm(Order_TM.y)) %>%
  filter(abs(TimeDiff) <= 24) %>%
  dplyr::select(-Order_TM.y,-Order_TM.x)
#             Name       Order_TM    TimeDiff
#1 MCCARTNEY, PAUL 3/4/2020 15:16  -3.0 hours
#2     STARR, RNGO 3/4/2020 15:16  -5.0 hours
#3    LENNON, JOHN 3/4/2020 19:30 -16.5 hours
库(dplyr)
图书馆(lubridate)
df1%>%
左联合(df2,by=“Name”)%%>%
突变(Order_TM=Order_TM.x,TimeDiff=mdy_hm(Order_TM.x)-mdy_hm(Order_TM.y))%>%
过滤器(abs(时间差)%
dplyr::select(-Order_TM.y,-Order_TM.x)
#名称顺序\u TM TimeDiff
#1保罗麦卡特尼2020年3月4日15:16-3.0小时
#2 STARR,RNGO 2020年3月4日15:16-5.0小时
#约翰·列侬3/4/2020 19:30-16.5小时

如果您喜欢
dplyr
解决方案,您可以尝试以下方法:

library(dplyr)
library(lubridate)
df1 %>% 
  left_join(df2,by = "Name") %>%
  mutate(Order_TM = Order_TM.x, TimeDiff = mdy_hm(Order_TM.x) - mdy_hm(Order_TM.y)) %>%
  filter(abs(TimeDiff) <= 24) %>%
  dplyr::select(-Order_TM.y,-Order_TM.x)
#             Name       Order_TM    TimeDiff
#1 MCCARTNEY, PAUL 3/4/2020 15:16  -3.0 hours
#2     STARR, RNGO 3/4/2020 15:16  -5.0 hours
#3    LENNON, JOHN 3/4/2020 19:30 -16.5 hours
库(dplyr)
图书馆(lubridate)
df1%>%
左联合(df2,by=“Name”)%%>%
突变(Order_TM=Order_TM.x,TimeDiff=mdy_hm(Order_TM.x)-mdy_hm(Order_TM.y))%>%
过滤器(abs(时间差)%
dplyr::select(-Order_TM.y,-Order_TM.x)
#名称顺序\u TM TimeDiff
#1保罗麦卡特尼2020年3月4日15:16-3.0小时
#2 STARR,RNGO 2020年3月4日15:16-5.0小时
#约翰·列侬3/4/2020 19:30-16.5小时

如果名称观测值在df1中出现多次,我如何获得两者的时差?如果名称观测值在df1中出现多次,我如何获得两者的时差?
library(dplyr)
library(lubridate)
df1 %>% 
  left_join(df2,by = "Name") %>%
  mutate(Order_TM = Order_TM.x, TimeDiff = mdy_hm(Order_TM.x) - mdy_hm(Order_TM.y)) %>%
  filter(abs(TimeDiff) <= 24) %>%
  dplyr::select(-Order_TM.y,-Order_TM.x)
#             Name       Order_TM    TimeDiff
#1 MCCARTNEY, PAUL 3/4/2020 15:16  -3.0 hours
#2     STARR, RNGO 3/4/2020 15:16  -5.0 hours
#3    LENNON, JOHN 3/4/2020 19:30 -16.5 hours