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

按组和条件去重失效:仅保留col2为A的col1重复项最新行

仅对指定分组去重并保留其他行的解决方案

问题描述

现有数据框df,其中col2包含A/B/C/D四类值,col3存储日期信息。需求如下:

  • 仅对col2 == 'A'的行,按col1去重,保留col3中日期最新的行
  • 完整保留col2为B/C/D的所有行,不对其进行去重操作

原代码存在的问题:

  1. 分组逻辑错误:group_by(col1, col3)不符合按col1去重的需求
  2. 过滤条件过严:filter(n() > 1 & col2 == 'A')直接筛除了所有非A的行,同时丢失了A类中无重复的行
  3. 未覆盖需保留的其他行逻辑,导致最终结果仅包含A类去重后的行

正确解决方案

方法一:分数据集处理后合并(逻辑清晰,易理解)

library(dplyr)

# 处理A类行:按col1分组,取日期最新的行
df_a_processed <- df %>%
  filter(col2 == "A") %>%
  group_by(col1) %>%
  arrange(desc(col3)) %>% 
  # 注意:若col3是真实日期字符串,需先转为Date类型:df$col3 <- as.Date(df$col3, format="你的日期格式")
  slice_head(n = 1) %>%
  ungroup()

# 提取B/C/D类的所有行
df_others <- df %>%
  filter(col2 %in% c("B", "C", "D"))

# 合并结果并按col1排序
final_result <- bind_rows(df_a_processed, df_others) %>%
  arrange(col1)

方法二:单管道链式处理(更简洁)

library(dplyr)

final_result <- df %>%
  group_by(col1, col2) %>%
  # 对A类组仅保留最新日期行,其他组保留所有行
  filter(if (first(col2) == "A") col3 == max(col3) else TRUE) %>%
  ungroup() %>%
  arrange(col1)

测试结果

使用提供的测试数据结构运行上述代码,将得到预期输出:

col1 col2 col3        
<int> <chr> <chr>       
1    11 A     newer date  
2    12 B     only 1 date 
3    13 C     only 1 date 
4    14 D     only 1 date 
5    22 A     newer date  
6    22 B     older date  

注意事项

如果col3是真实日期(如"2024-05-01"),务必先将其转换为Date类型,否则字符串排序可能导致取错最新日期:

df$col3 <- as.Date(df$col3, format="%Y-%m-%d") # 根据实际日期格式调整

内容的提问来源于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.24 14:06:19