R语言:group_by分组后删除所有值为NA的行
R语言分组后删除非分组列全为NA的行
示例数据集
df <- data.frame( Col1 = c("B","B","C","D","P1","P2","P3"), Col2 = c(NA,8,NA,9,10,8,9), Col3 = c(NA,7,6,8,NA,7,8), Col4 = c(NA,NA,7,7,NA,7,7) )
方法一:使用dplyr包(推荐)
借助dplyr的分组与过滤函数,代码简洁直观:
library(dplyr) df_cleaned <- df %>% group_by(Col1) %>% # 保留Col2/Col3/Col4不全为NA的行 filter(!if_all(c(Col2, Col3, Col4), is.na)) %>% ungroup()
代码说明:
group_by(Col1):按Col1列对数据框分组filter(!if_all(..., is.na)):if_all检查指定列的所有值是否均为NA,取反后保留至少有一个非NA值的行ungroup():取消分组状态,返回标准数据框
方法二:Base R实现
无需加载额外包,用base R原生函数完成:
# 标记每行是否Col2/Col3/Col4全为NA row_all_na <- apply(df[, c("Col2", "Col3", "Col4")], 1, function(x) all(is.na(x))) # 按Col1分组,筛选非全NA的行 df_cleaned_base <- df[!ave(row_all_na, df$Col1, FUN = identity), ]
结果验证
运行上述代码后,得到的结果与期望一致:
| Col1 | Col2 | Col3 | Col4 |
|---|---|---|---|
| B | 8 | 7 | NA |
| C | NA | 6 | 7 |
| D | 9 | 8 | 7 |
| P1 | 10 | NA | NA |
| P2 | 8 | 7 | 7 |
| P3 | 9 | 8 | 7 |
内容的提问来源于stack exchange,提问作者krishthw
相关产品推荐
相关产品推荐

