r - 在 data.table 中按 colSums 选择列并按 rowSums 过滤
问题描述
library(data.table)
a <- mtcars
setDT(a)
b <- a[,colSums(.SD)>500,.SDcols=setdiff(names(a),c("vs","am"))]
在这个人为的示例中,我想选择满足colSums
条件的列,而不使用vs
andam
列。上面的代码只是产生了正确列的逻辑向量,但实际上并没有将所需的整个列选择到新的 dt 中。此外,setdiff
解决方案.SDcols
似乎相当简洁和冗长。是否有更有效/更简洁的语法来执行此操作 - 我尝试使用 .SDcols=-c("vs","am") 没有帮助?
解决方案
我们可以使用.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)]]
推荐阅读
- python - 从另一个模型中获取值列表
- python - 嵌套字典格式化输出问题
- python - tkinter wait_variable 不会回调 intvar 更改
- react-jsonschema-forms - 反应json模式表单不发送空值键
- javascript - 我需要重新加载我的页面以显示 CKEDITOR
- python - 嵌套列表理解返回列表列表而不是单个列表
- python - 如何在 VS Code 中配置 python 大纲模式以仅显示类和方法
- sql - 自动刷新来自 Excel 工作表的 SQL 数据库数据
- css - 减小列表项宽度以在 Internet Explorer 11 中占据文本内容的确切大小
- python - 从列表中删除元素时遇到问题