R语言使用data.table筛选列名匹配多条件的数据子集
data.table 多条件匹配选列+行筛选等效实现
核心方案
你要实现的逻辑分两部分:匹配列名含ABC/XYZ的列、保留这些列中任意一列值大于0的行,不需要硬编码列索引,直接用data.table内置的列匹配语法一步完成即可,效果和你给出的dplyr代码完全一致:
library(data.table) # 若df尚未转换为data.table对象,先执行这行 setDT(df) # 一步完成选列+行筛选 result <- df[ rowSums(.SD > 0) > 0, .SD, .SDcols = patterns("ABC|XYZ") ]
逻辑说明
.SDcols = patterns("ABC|XYZ"):是data.table原生支持的列筛选写法,自动匹配所有列名中包含ABC或XYZ的列,列顺序和原数据框完全一致,不会因为匹配逻辑打乱原有列的排列,比手动拼接两次grep结果更简洁。- 中间参数位置的
.SD:代指.SDcols选中的所有列组成的数据子集。 - 行位置的
rowSums(.SD > 0) > 0:逐行统计选中列中值大于0的列数,只要任意一列值大于0,该行的统计结果就会大于0,满足保留条件,筛选效率远高于逐列写|条件判断。
对应原dplyr写法的等价版本
如果你需要完全对齐你给出的dplyr中两次grep的选列逻辑(实际运行结果和上面的正则写法完全无差异),可以用下面的写法:
result <- df[ rowSums(.SD > 0) > 0, .SD, .SDcols = c(grep("ABC", names(df)), grep("XYZ", names(df))) ]
补充:如果只需要实现多条件选列、不需要做行筛选,直接写
df[, grep("ABC|XYZ", names(df)), with = FALSE]即可,和你已知的单条件grep写法逻辑一致,只是在正则里用|表示匹配多个模式的或关系。
内容的提问来源于stack exchange,提问作者Stinky_Goat
相关产品推荐
相关产品推荐

