R语言实现仅当三列同时为NA时删除对应数据行
R语言实现三列同时为NA才删除行的方法
原有代码错误说明
你之前写的两段代码无法得到预期结果,原因如下:
- 第一段代码的核心错误:R中不能使用
== NA判断值是否为缺失值,任何值与NA做==比较的返回结果都是NA,无法得到TRUE/FALSE的逻辑判断值,缺失值判断必须使用is.na()函数;同时这段代码的筛选逻辑是提取三列全为NA的行,和你要保留非全NA行的需求完全相反。 - 第二段代码的核心错误:
complete.cases()的规则是传入的所有值都非NA时才返回TRUE,这段代码的逻辑是要求A、B、C三列全部为非NA值才保留行,会把三列中仅1列、2列有有效值的行也误删,不符合你的筛选规则。
正确实现代码
你的筛选规则本质是:仅删除A、B、C三列取值同时为NA的行,只要任意一列存在非NA有效值就保留该行,以下几种写法都可以实现需求:
基础R写法1(统计每行NA数量)
通过统计每行指定三列的NA总数,不等于3(即不是三列全NA)的行就保留:
# 把A、B、C替换成你数据里实际的列名即可 data_new <- data[rowSums(is.na(data[, c("A", "B", "C")])) != 3, ]
基础R写法2(subset逻辑判断)
直接通过逻辑运算符判断三列中是否至少有一个非NA值,符合条件就保留:
data_new <- subset(data, !is.na(A) | !is.na(B) | !is.na(C))
dplyr写法(适配tidyverse工作流)
如果你日常用dplyr做数据清洗,可以用if_all配合filter实现:
library(dplyr) data_new <- data %>% filter(!if_all(c(A, B, C), is.na))
效果验证
用你提供的示例数据运行上述任意一段代码,都会得到如下结果:第1、4行三列全为NA的行会被删除,第2行C列为10、第3行B列为29的行都会被完整保留,完全符合预期规则。
内容的提问来源于stack exchange,提问作者Xams
相关产品推荐
相关产品推荐

