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

R语言数据集条件去重:保留分组内非NA及最大值行

解决方案:过滤NA并保留每个序列号的最新日期行

针对你的需求——去除col2中的NA值,同时为每个col1(序列号)保留col2(日期)最大的行,以下是准确的处理方法,同时解释你之前代码出现问题的原因:

问题分析

你使用top_n(1, col2)出现误删非重复行的情况,核心原因是未先过滤NA值:当某个col1组内只有一行且col2为NA时,max(col2)会返回NA,top_n无法匹配到有效行,导致该行被误删;另外,旧版本dplyr的top_n函数在处理NA和分组逻辑时存在歧义,容易出现不符合预期的筛选结果。

正确代码实现

方法1:先过滤NA,再分组筛选最大值行

library(dplyr)

df <- df %>%
  # 第一步:过滤掉col2为NA的行,彻底排除NA的干扰
  filter(!is.na(col2)) %>%
  # 按序列号分组
  group_by(col1) %>%
  # 筛选每个组中col2等于最大值的行(即最新日期)
  filter(col2 == max(col2)) %>%
  # 取消分组,恢复普通数据框结构
  ungroup()

方法2:使用更直观的slice_max函数(推荐)

slice_max是dplyr较新版本推出的函数,逻辑更清晰,专门用于提取分组内的最大行:

library(dplyr)

df <- df %>%
  filter(!is.na(col2)) %>%
  group_by(col1) %>%
  # 每个组取1行,按col2降序(即取最大的日期)
  slice_max(n = 1, order_by = col2) %>%
  ungroup()

验证示例数据

用你的示例数据测试:
原数据:

col1 col2
a    NA
a    1
b    1
c    1
d    1
d    2

经过上述代码处理后,会得到:

col1 col2
a    1
b    1
c    1
d    2

(注:你示例中的期望结果d对应1,这和“保留最大日期”的需求矛盾,推测是笔误,实际按逻辑会保留d对应的2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:12:36