首页 > 解决方案 > 在 data.table 中按 colSums 选择列并按 rowSums 过滤

问题描述

library(data.table)
a <- mtcars
setDT(a)
b <- a[,colSums(.SD)>500,.SDcols=setdiff(names(a),c("vs","am"))]

在这个人为的示例中,我想选择满足colSums条件的列,而不使用vsandam列。上面的代码只是产生了正确列的逻辑向量,但实际上并没有将所需的整个列选择到新的 dt 中。此外,setdiff解决方案.SDcols似乎相当简洁和冗长。是否有更有效/更简洁的语法来执行此操作 - 我尝试使用 .SDcols=-c("vs","am") 没有帮助?

标签: rdata.table

解决方案


我们可以使用.SD基于逻辑向量来选择列

library(data.table)
a[, .SD[, colSums(.SD)>500, with = FALSE],.SDcols=setdiff(names(a),c("vs","am"))]

如果我们想这样做rowSums,就用它作为索引

d <- a[, .SD[rowSums(.SD)>300],.SDcols=-c(8,9)]

或与Reduce

 a[, .SD[Reduce(`+`, .SD) > 300], .SDcols = -c(8, 9)]

如果我们需要获取所有列,请使用.I而不是.SD

a[a[, .I[Reduce(`+`, .SD) > 300], .SDcols = -c(8, 9)]]

推荐阅读