如何批量删除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
相关产品推荐
相关产品推荐

