我有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"))
我想在mydata
数据框中任何时间的+/- 5秒窗口内保留master中的所有行。我想删除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"))
您可以看到mydata
仅包含"2015-01-01 00:00:18"
。在这种情况下,我想从主数据框中删除时间不在+ - 5秒窗口内的所有行,即我想在master
之前和{{{}之前删除"2015-01-01 00:00:13"
中的所有行1}}
这是一个简单的案例,但更难的情况是如果mydata包含
"2015-01-01 00:00:23"
在这种情况下,由于 mydata = data.frame(MyTimes = as.POSIXct(c("2015-01-01 00:00:18", "2015-01-01 00:00:22"),tz = "GMT"))
再次存在,我通常会在"2015-01-01 00:00:18"
之前和"2015-01-01 00:00:13"
之后删除master中的所有行。
但是在这种情况下我无法做到这一点,因为"2015-01-01 00:00:23"
还包含mydata
所以我想在"2015-01-01 00:00:22"
之后master
之前"2015-01-01 00:00:18"
之前保留所有行1}}
由于"2015-01-01 00:00:27"
位于我的数据中,我现在需要将主页中的行从"2015-01-01 00:00:22"
保留到"2015-01-01 00:00:23"
基本上我想在master中保留"2015-01-01 00:00:27"
中每行+/- 5秒窗口内的任何行。如果母版中的任何行在5秒钟窗口内不,我想删除它。
如果mydata
和master
列有多列,可以建议如何实现此目的:
mydata
实际上,master和mydata都有50多列。
答案 0 :(得分:1)
Base R解决方案:
check_valid_time <- function(row, mydata){
any(row > mydata$MyTimes - 5 & row < mydata$MyTimes + 5)
}
master[sapply(master$MasterTimes, check_valid_time, mydata),]
答案 1 :(得分:1)
一种可能性如下。首先创建foo
,每行包含+/- 5秒的mydata $ MyTimes。然后,您将master
分组。首先,删除mydata$MyTimes
,然后在MasterTimes中选择foo$whatever
。为了以防万一,我最后按MasterTimes
对数据进行了排序。
foo <- setDT(mydata)[, list(whatever = seq(MyTimes - 5, MyTimes + 5, by = 1)), by = rownames(mydata)]
master[!MasterTimes %in% mydata$MyTimes][MasterTimes %in% foo$whatever] -> x
setorder(x, MasterTimes)
答案 2 :(得分:0)
以nicola的评论为基础:
master[unlist(lapply(master$MasterTimes, function(x) any(abs(difftime(x, mydata$MyTimes, units="secs"))<5) )),]
答案 3 :(得分:0)
或者像这样:
master[which(sapply(unlist(master), function(x)
min(sapply(unlist(mydata), function(y) abs(x - y)))) <5 ),]