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

如何筛选数据框中指定列全为NA值的类别

筛选DataFrame中满足条件的类别

需求:给定包含类别列cat及col1、col2、col3三列的DataFrame,找出在任意一列中该类别对应值全部为NA的类别,最终结果以向量形式输出。

示例数据

col1 <- c("yes","no","yes","no",NA,NA,NA)
col2 <- c(NA,NA,"yes","no","yes","no",NA)
col3 <- c(NA,"yes",NA,"no","yes","no","yes")

cat <- c("cat1","cat2","cat1","cat2","cat3","cat3","cat3")

df <- data.frame(cat,col1,col2,col3)

预期结果

end_result <- c("cat1","cat3")

解决方案

方法一:使用dplyr包

按cat分组后,逐一检查每组在各列是否存在全NA的情况,最后提取符合条件的类别:

library(dplyr)

result <- df %>%
  group_by(cat) %>%
  summarize(
    has_all_na = any(
      all(is.na(col1)),
      all(is.na(col2)),
      all(is.na(col3))
    )
  ) %>%
  filter(has_all_na) %>%
  pull(cat)

# 输出结果
result
# [1] "cat1" "cat3"

方法二:使用基础R

通过tapply按组检查每列的NA状态,再通过逻辑运算筛选出符合条件的类别:

# 按类别分组,检查每列是否全为NA
col1_all_na <- tapply(df$col1, df$cat, function(x) all(is.na(x)))
col2_all_na <- tapply(df$col2, df$cat, function(x) all(is.na(x)))
col3_all_na <- tapply(df$col3, df$cat, function(x) all(is.na(x)))

# 筛选任意一列全为NA的类别
result <- names(which(col1_all_na | col2_all_na | col3_all_na))

# 输出结果
result
# [1] "cat1" "cat3"

内容的提问来源于stack exchange,提问作者Basil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:55:11