如何在data.table中剔除NA值,保留含零的非NA行列
如何剔除data.table中的全NA行和全NA列,保留含非NA值(包括0)的行列
你需要处理一个可能存在整行/整列全NA的data.table对象random_dt,要求仅保留至少包含一个非NA值(包括0)的行和列。之前使用na.omit()得到空表,是因为na.omit()会删除任何包含NA的行,而非仅删除全NA的行——如果表中所有行都至少包含一个NA(比如存在全NA列,导致每行都带NA),na.omit()就会清空所有行。
解决方案
正确的思路是先移除全NA列,再移除全NA行,用data.table的高效向量操作实现:
library(data.table) # 1. 删除所有全为NA的列 clean_dt <- random_dt[, colSums(!is.na(.SD)) > 0, with = FALSE] # 2. 删除所有全为NA的行 clean_dt <- clean_dt[rowSums(!is.na(clean_dt)) > 0]
代码解释
colSums(!is.na(.SD)) > 0:统计每列的非NA值数量,筛选出至少有一个非NA值的列rowSums(!is.na(clean_dt)) > 0:统计每行的非NA值数量,筛选出至少有一个非NA值的行
如果数据中存在0值,0属于非NA范畴,会被正常保留,完全符合需求。
测试验证
用你提供的set.seed(2)生成的random_dt执行上述代码后,会保留前3行以及V2、V4、V6、V8列的有效数据,不会返回空表。
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

