You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量删除data.table中含Inf/NaN值的行?

批量删除data.table中含Inf/NaN的行

问题背景

当data.table包含大量列时,需要批量删除所有存在Inf或NaN值的行,无需逐个指定列编写判断条件。

示例数据

Group<-c("A","B","C","D","E","F","G")
LRR <- c(Inf, 1,2,3,-Inf,4, 5)
LRR.var <- c(NaN, Inf, 3, -Inf, -Inf, 6,7)
data<-data.table(cbind(Group, LRR, LRR.var))

输出结果:

Group  LRR LRR.var
1:     A  Inf     NaN
2:     B    1     Inf
3:     C    2       3
4:     D    3    -Inf
5:     E -Inf    -Inf
6:     F    4       6
7:     G    5       7

尝试直接使用data[!is.finite(data)]时触发报错:

Error: default method not implemented for type 'list'

解决方案

方法1:利用.SD与Reduce批量判断(推荐)

针对数值型列自动批量检查,通过Reduce将每行所有列的判断结果做逻辑与,仅保留所有数值列均为有限值的行:

# 先筛选出所有数值型列
num_cols <- sapply(data, is.numeric)
# 批量筛选符合条件的行
clean_data <- data[Reduce(`&`, lapply(.SD, is.finite)), .SDcols = num_cols]

输出结果:

Group LRR LRR.var
1:     C   2       3
2:     F   4       6
3:     G   5       7

方法2:通过rowSums统计非有限值数量

统计每行中Inf/NaN的数量,筛选数量为0的行:

num_cols <- sapply(data, is.numeric)
clean_data <- data[rowSums(!is.finite(.SD)) == 0, .SDcols = num_cols]

方法3:结合between函数排除极端值

利用between限定数值范围,同时排除NaN:

num_cols <- sapply(data, is.numeric)
clean_data <- data[Reduce(`&`, lapply(.SD, function(x) between(x, -Inf, Inf) & !is.nan(x))), .SDcols = num_cols]

内容的提问来源于stack exchange,提问作者Saurabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:56:13