删除data.table中的范围

krh*_*hlk 8 r data.table

我试图从数据表中排除一些行,比如天数和月份 - 不包括例如暑假,这些行总是从6月15日开始到下个月15日结束.我可以根据Date提取那些日子,但是as.Date函数运行速度非常慢,我有月和日的单独整数列,我想只使用它们.

通过选择给定的条目很容易

DT[Month==6][Day>=15]
DT[Month==7][Day<=15]
Run Code Online (Sandbox Code Playgroud)

有没有办法如何使两者data.tables(原始的和我选择的)"差异" .(为什么不是子集?也许我错过了一些简单的东西,但我不想排除像10/6,31/7这样的日子.)

我知道有一种方法可以通过加入来实现,但只是日复一日

setkey(DT, Month, Day)
DT[-DT[J(Month,Day), which= TRUE]]
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助如何以更一般的方式解决它?

Mat*_*wle 3

很好的问题。我已编辑问题标题以匹配问题。

一个简单的方法避免as.Date读起来很好:

DT[!(Month*100L+Day) %between% c(0615L,0715L)]
Run Code Online (Sandbox Code Playgroud)

在很多情况下这可能已经足够快了。如果您有很多不同的范围,那么您可能需要升级:

DT[,mmdd:=Month*100L+Day]
from = DT[J(0615),mult="first",which=TRUE]
to = DT[J(0715),mult="first",which=TRUE]
DT[-(from:to)]
Run Code Online (Sandbox Code Playgroud)

这有点长并且容易出错,因为它是 DIY 的。因此,一个想法是表list中的列i代表范围查询(FR#203,如二分搜索%between%)。然后,可以将未加入(也尚未实现,FR#1384)与列表列范围查询结合起来,以完全按照您的要求进行操作:

setkey(DT,mmdd)
DT[-J(list(0615,0715))]
Run Code Online (Sandbox Code Playgroud)

这将以通常的方式扩展到多个不同的范围,或者许多不同 id 的相同范围;即,更多行添加到i.