如何借助列名向量筛选data.table中多指定列均为同一值的行
实现方案
需求说明:基于给定的列名向量cols,筛选出这些列的取值全部等于指定目标值(示例中为'a')的行,所有判断均为列与目标值的直接比较,不涉及列之间的互相校验。
方案1:data.table原生实现(推荐)
利用.SDcols指定操作列,结合Reduce合并多列判断条件:
# 定义目标匹配值 target <- 'a' # 筛选逻辑 result <- dt[Reduce(`&`, lapply(.SD, function(x) x == target)), .SDcols = cols]
逻辑说明:
.SDcols = cols指定后续操作仅作用于cols包含的列lapply(.SD, function(x) x == target)会逐列生成和目标值比较的布尔向量Reduce(&, ...)将所有布尔向量按行执行逻辑与运算,只有所有列都匹配目标值的行才会返回TRUE
方案2:base R实现
用rowSums统计每行不符合条件的列数,筛选不符合数为0的行:
target <- 'a' # data.table格式下保留with=FALSE确保列筛选正确,base R数据框可直接写dt[,cols] result <- dt[rowSums(sapply(dt[, cols, with = FALSE] != target)) == 0, ]
逻辑说明:
- 先对
cols包含的所有列逐列判断是否不等于目标值,生成布尔矩阵 rowSums统计每行中不等于目标值的列数,结果为0说明所有列都匹配目标值
结果验证
两种方案的输出和手动编写的dt[id=='a' & id2=='a' & test == 'a']完全一致,示例数据下返回的结果为:
id amount id2 test 1: a 1 a a
内容的提问来源于stack exchange,提问作者R. Cowboy
相关产品推荐
相关产品推荐

