我有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秒窗口内,我想删除它.
你能告诉我如何实现这一点,如果master和mydata具有大于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多列.
基础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)