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

时间:2016-03-23 17:17:43

标签: 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"))

我想在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秒钟窗口内,我想删除它。

更新

如果mydatamaster列有多列,可以建议如何实现此目的:

mydata

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

4 个答案:

答案 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 ),]