R data.table按条件过滤仅排除满足条件行、保留含NA行的实现咨询
问题核心原因
R中逻辑比较运算的结果包含NA时,subset或data.table的行过滤逻辑都会默认排除条件为NA的行,这就是你原写法丢失含NA行的原因。
最简实现方案
你需要的规则是仅当b < a明确为TRUE时排除行,isTRUE()函数刚好符合这个判断逻辑:它仅当输入严格为TRUE时返回TRUE,输入为FALSE或NA时都返回FALSE。所以过滤条件可以直接简化为:
# data.table原生语法,大数据集下效率比subset更高 dt[!isTRUE(b < a)]
如果你习惯用subset也可以写成:
subset(dt, !isTRUE(b < a))
以上两种写法运行后都能得到你预期的结果。
其他等价简化写法(基于德摩根定律)
你原来的条件is.na(a) | is.na(b) | !(b < a)可以通过逻辑转换写成否定联言格式,和原始逻辑完全等价:
dt[!(!is.na(a) & !is.na(b) & b < a)]
该写法可读性和简洁度略低于isTRUE方案,适合需要明确体现NA判断逻辑的场景。
内容的提问来源于stack exchange,提问作者MDSF
相关产品推荐
相关产品推荐

