如何高效检查点P(x,y)是否存在于两列data.table中?
高效检查点是否存在于data.table行中的方法
你问的这个问题很典型,用普通的%in%或者循环确实搞不定,而且效率低。刚好data.table有几种非常适合的高效解法,我给你列出来:
方法1:利用data.table的键(Key)快速查找
如果需要频繁做这类查询,给data.table设置键是最优解——因为键会让数据排序,查找时用二分法,速度快到飞起:
library(data.table) dt <- data.table(x=c(1,2,3,4,5), y = c(2,3,4,5,6)) P <- c(2,3) # 给dt设置x和y为组合键 setkey(dt, x, y) # 检查点是否存在:匹配不到就返回空,any()判断是否有结果 any(dt[.(P[1], P[2]), nomatch = 0]) # 输出:TRUE
解释一下:dt[.(P[1], P[2]), nomatch=0]会精准匹配x=2且y=3的行,nomatch=0确保没有匹配时返回空表,any()只要有匹配行就返回TRUE。
方法2:直接用矢量化条件判断(单次查询首选)
如果只是偶尔查一次,不用设置键,直接写条件判断就行,data.table的矢量化操作本身就比循环高效N倍:
any(dt$x == P[1] & dt$y == P[2]) # 输出:TRUE
这个逻辑很直白:逐行检查x等于P的第一个值,同时y等于第二个值,any()只要有一行满足就返回TRUE,代码简洁又高效。
为什么你之前的方法不行?
P %in% dt是按单个元素匹配,不是按行匹配的——它会检查2和3是否在dt的所有元素里,而不是整行同时满足x=2且y=3,所以才会出现只有第一行“看似有效”的错觉。- 循环的问题在于它是逐行遍历,当dt数据量很大时,矢量化操作的速度会比循环快几个数量级,完全不是一个档次。
内容的提问来源于stack exchange,提问作者Adamek
相关产品推荐
相关产品推荐

