如何在R语言中过滤删除指定列全为缺失值的数据行?
过滤R数据框中指定列全为NA的行
原始数据
定义数据框:
df <- data.frame(cntry = c("A", "A", "B", "C", "C"), year = c(2010, 2011, 2010, 2010, 2011), env_1 = c(NA,NA,0,0,NA), env_2 = c(NA,NA,1,1,0), env_3 = c(NA,1,1,NA,0))
数据预览:
cntry year env_1 env_2 env_3 A 2010 NA NA NA A 2011 NA NA 1 B 2010 0 1 1 C 2010 0 1 NA C 2011 NA 0 0
需求
删除env_1、env_2、env_3列**全部为缺失值(NA)**的行,保留这些列中至少有一个非NA值的行。
错误尝试说明
之前使用if_all的代码会过滤掉所有包含NA的行,不符合需求:
df %>% filter(if_all(starts_with("env"), ~ !is.na(.x)))
正确解决方案
1. 使用dplyr的if_any(最简洁)
if_any用于检查指定列中至少有一个满足条件,这里我们需要保留那些至少有一列非NA的行:
library(dplyr) df %>% filter(if_any(starts_with("env"), ~ !is.na(.x)))
2. 用rowSums统计非NA数量
通过计算每行env列中非NA值的数量,保留数量大于0的行:
df %>% filter(rowSums(!is.na(select(., starts_with("env")))) > 0)
3. 基础R实现
无需dplyr的情况下,可以用以下代码:
# 筛选env开头的列 env_cols <- grepl("^env_", names(df)) # 保留非NA数量大于0的行 df[rowSums(!is.na(df[, env_cols])) > 0, ]
结果
执行上述任意方法后,得到目标结果:
cntry year env_1 env_2 env_3 A 2011 NA NA 1 B 2010 0 1 1 C 2010 0 1 NA C 2011 NA 0 0
内容的提问来源于stack exchange,提问作者Joost Maxen
相关产品推荐
相关产品推荐

