如何筛选数据框中指定列全为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
相关产品推荐
相关产品推荐

