能否使用data.table的.SDcols参数筛选符合多列条件的行
data.table中使用.SDcols配合行筛选的实现方法
可以通过 .SD + .SDcols的组合实现多列统一判断条件的行筛选,无需手动书写重复判断逻辑。
原有写法的问题
你提供的代码无法运行有两个核心原因:
- 语法错误:
.SDcols中vs的引号未配对,c('vs, 'am', 'carb')存在语法格式错误 - 逻辑错误:行筛选的
i位置需要接收一维逻辑向量/行索引,直接传入lapply返回的列表结构无法被识别,且.SD == 1返回的是多列逻辑矩阵,不能直接作为行筛选条件。
可行的实现写法
写法1:Reduce搭配逻辑运算(推荐,适配任意判断条件)
要实现所有指定列取值均为1的筛选,用Reduce把多列的逻辑判断结果做逐元素与运算即可:
mtcars[Reduce(`&`, lapply(.SD, `==`, 1)), .SDcols = c("vs", "am", "carb")]
- 逻辑说明:
lapply(.SD,==, 1)会对.SDcols指定的3列分别做等于1的判断,返回包含3个逻辑向量的列表;Reduce(&, ...)会把3个逻辑向量逐元素做与运算,最终得到一维逻辑向量,符合行筛选的参数要求。 - 拓展:如果需要筛选任意一列取值为1的行,只需把
&替换为|即可。
写法2:rowSums计数(适配相等判断场景,更简洁)
针对判断所有列等于某个固定值的场景,也可以用行计数的方式实现:
mtcars[rowSums(.SD == 1) == length(.SD), .SDcols = c("vs", "am", "carb")]
逻辑说明:统计每一行中等于1的单元格数量,当数量等于指定列的总数时,说明所有列都满足等于1的条件。
内容的提问来源于stack exchange,提问作者MatthewR
相关产品推荐
相关产品推荐

