如何根据另一个数据表中的条件从数据表中删除行

use*_*875 7 r data.table

我有2个数据框:

master = data.table(MasterTimes= as.POSIXct("2015-01-01", tz = "GMT") + seq(1,100,1))
mydata = data.frame(MyTimes = as.POSIXct(c("2015-01-01 00:00:18","2015-01-01 00:00:54","2015-01-01 00:00:48","2015-01-01 00:01:10","2015-01-01 00:01:05"),tz = "GMT"))
Run Code Online (Sandbox Code Playgroud)

我想在数据帧中的任何时间的+/- 5秒窗口内保留master中的任何行mydata.我想删除master不符合该条件的行.

如果mydata只有1行,这是一个更简单的例子:

master = data.table(MasterTimes= as.POSIXct("2015-01-01", tz = "GMT") + seq(1,100,1))
mydata = data.frame(MyTimes = as.POSIXct(c("2015-01-01 00:00:18"),tz = "GMT"))
Run Code Online (Sandbox Code Playgroud)

你只能看到mydata包含"2015-01-01 00:00:18".在这种情况下,我想删除主数据框中的所有行,其中时间不在+ - 5秒窗口内,即我想删除master之前"2015-01-01 00:00:13"和之后的所有行"2015-01-01 00:00:23"

这是一个简单的案例,但更难的情况是如果mydata包含

   mydata = data.frame(MyTimes = as.POSIXct(c("2015-01-01 00:00:18", "2015-01-01 00:00:22"),tz = "GMT"))
Run Code Online (Sandbox Code Playgroud)

在这种情况下因为"2015-01-01 00:00:18"再次出现我通常会删除master之前"2015-01-01 00:00:13"和之后的所有行"2015-01-01 00:00:23".

但在这种情况下,我不能这样做,因为mydata还包含"2015-01-01 00:00:22",所以我想保持中的所有行master之后"2015-01-01 00:00:18"和之前"2015-01-01 00:00:27"

因为"2015-01-01 00:00:22"在我的数据中,我现在需要将master中的行保持"2015-01-01 00:00:23""2015-01-01 00:00:27"

基本上我想保留master中任何一行,在每行的+/- 5秒窗口内mydata.如果master中有任何行不在 5秒窗口内,我想删除它.

更新

你能告诉我如何实现这一点,如果mastermydata具有大于1列,如:

master = data.table(MasterTimes= as.POSIXct("2015-01-01", tz = "GMT") + seq(1,100,1), otherol = seq(1,100,1))
mydata = data.frame(MyTimes = as.POSIXct(c("2015-01-01 00:00:18"),tz = "GMT"),othercol = c(1))
Run Code Online (Sandbox Code Playgroud)

实际上,master和mydata都有50多列.

C_Z*_*_Z_ 1

基础R溶液:

check_valid_time <- function(row, mydata){
   any(row > mydata$MyTimes - 5 & row < mydata$MyTimes + 5)
}

master[sapply(master$MasterTimes, check_valid_time, mydata),]
Run Code Online (Sandbox Code Playgroud)