如何高效筛选data.table中至少包含一个负值的行并生成新data.table
筛选data.table中含至少一个负值的行
针对你的需求——从包含大量Stage列的data.table中提取所有至少有一个负值的完整行,这里有个高效且简洁的解决方案,完美适配你的大数据集场景:
代码实现
library(data.table) # 你的示例数据 dt <- data.table( ID = c(42, 43, 44), Stage_1 = c(-6, 7, 4), Stage_2 = c(-15, 4, -8), Stage_3 = c(-20, 2, -5) ) # 核心筛选逻辑 dt2 <- dt[rowSums(.SD < 0) > 0, , .SDcols = patterns("^Stage_")]
为什么这么写?
.SDcols = patterns("^Stage_"):自动匹配所有以Stage_开头的列,不用手动输入50个列名,省时间还避免出错rowSums(.SD < 0):用向量化的方式快速计算每行里负值的个数,比逐行遍历的apply效率高得多,处理大数据集时优势明显rowSums(...) > 0:只保留负值数量大于0的行,也就是至少有一个负值的完整行
验证结果
运行后你会得到期望的输出:
> dt2 ID Stage_1 Stage_2 Stage_3 1: 42 -6 -15 -20 2: 44 4 -8 -5
如果你的Stage列命名规则不同,只需要调整patterns里的正则表达式就行(比如如果列名是S1、S2,就改成patterns("^S"))。
内容的提问来源于stack exchange,提问作者winnieeliz
相关产品推荐
相关产品推荐

