如何在data.table中先过滤条件再按行号提取行子集?
在data.table中先过滤行再提取前N行的方法
要实现先筛选foo列不为NA的所有行,再取该结果的前50行,直接通过data.table的链式索引即可完成,这是最直观且符合需求的方式:
dt[!is.na(foo)][1:50]
原理说明
- 第一个索引
[!is.na(foo)]会先遍历整个data.table,筛选出所有foo列非NA的行,返回一个新的data.table对象; - 第二个索引
[1:50]则针对这个筛选后的结果,提取其前50行,完全避免了“先取前50行再过滤”可能返回0行的问题。
你也可以用head()函数实现相同效果,写法稍显不同但逻辑一致:
dt[!is.na(foo), head(.SD, 50)]
注意:避免错误写法
不要使用以下顺序的索引,这会先取原表前50行再过滤,不符合你的需求:
# 错误示例:先取前50行再过滤,可能返回0行 dt[1:50][!is.na(foo)]
内容的提问来源于stack exchange,提问作者Beres
相关产品推荐
相关产品推荐

