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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:50:15