我试图根据天和月从数据表中排除一些行 - 例如排除暑假,这些行总是从 6 月 15 日开始,到下个月 15 日结束。我可以根据日期提取这些日子,但由于 as.Date 函数运行起来非常慢,我有单独的月份和日期整数列,我想仅使用它们来完成此操作。
通过以下方式很容易选择给定的条目
DT[Month==6][Day>=15]
DT[Month==7][Day<=15]
有什么办法可以使两者“不同”data.tables
(原来的和我选择的)。 (为什么不子集?也许我错过了一些简单的东西,但我不想排除像 10/6、31/7 这样的日子。)
我知道一种通过 join 来做到这一点的方法,但只是日复一日
setkey(DT, Month, Day)
DT[-DT[J(Month,Day), which= TRUE]]
谁能帮助如何以更通用的方式解决它?
很好的问题。我已编辑问题标题以匹配问题。
一个简单的方法可以避免as.Date
读起来很好:
DT[!(Month*100L+Day) %between% c(0615L,0715L)]
在很多情况下这可能已经足够快了。如果您有很多不同的范围,那么您可能需要升级:
DT[,mmdd:=Month*100L+Day]
from = DT[J(0615),mult="first",which=TRUE]
to = DT[J(0715),mult="first",which=TRUE]
DT[-(from:to)]
这有点长而且容易出错,因为它是 DIY 的。所以一个想法是list
列中的i
表将表示范围查询(,就像二分查找%between%
)。然后一个not-join(也尚未实施,)可以与列表列范围查询结合起来,以完全按照您的要求进行操作:
setkey(DT,mmdd)
DT[-J(list(0615,0715))]
这将以通常的方式扩展到多个不同的范围,或者许多不同 id 的相同范围;即添加更多行i
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)