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

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), ]

结果验证

运行上述代码后,得到的结果与期望一致:

Col1Col2Col3Col4
B87NA
CNA67
D987
P110NANA
P2877
P3987

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:30:37