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

跨分组去除重复数据:基于Name、ID与Code1的数据集清洗需求

问题描述

现有包含Name、ID、Start、Code1、City、Real.Start列的数据集,需针对每个重复出现的Code1,仅保留其对应Start日期最晚的行,最终得到指定输出。以Jack的数据为例:

  • Code1为abc的行共3条,保留Start为31/3/2022(ID=333)的行
  • Code1为hij的行共2条,保留Start为28/3/2022(ID=222)的行
  • Code1为def、efg的行仅各1条,直接保留

原始数据集代码:

data = tibble::tribble(
   ~Name,  ~ID,      ~Start, ~Code1,   ~City, ~Real.Start,
  "Jack", 111L, "24/3/2022",  "abc", "City1",  "8/4/2022",
  "Jack", 111L, "24/3/2022",  "def", "City2", "25/3/2022",
  "Jack", 111L, "24/3/2022",  "efg", "City3", "26/3/2022",
  "Jack", 111L, "24/3/2022",  "hij", "City4", "28/3/2022",
  "Jack", 222L, "28/3/2022",  "abc", "City1",  "8/4/2022",
  "Jack", 222L, "28/3/2022",  "hij", "City4", "28/3/2022",
  "Jack", 333L, "31/3/2022",  "abc", "City1",  "8/4/2022"
  )
解决方案

使用dplyr包处理,核心逻辑是按Code1分组后保留每组内日期最晚的行,步骤如下:

  1. 将Start列转换为日期格式,确保能正确比较早晚
  2. 按Code1分组,筛选出每组中Start最晚的行
  3. 转换回原始日期字符串格式并按ID排序,匹配期望输出的顺序

代码实现:

library(dplyr)

output <- data %>%
  # 转换为日期格式(适配日/月/年的输入格式)
  mutate(Start = as.Date(Start, format = "%d/%m/%Y")) %>%
  # 按Code1分组,保留每组日期最晚的行
  group_by(Code1) %>%
  filter(Start == max(Start)) %>%
  ungroup() %>%
  # 按ID排序,对齐期望输出顺序
  arrange(ID) %>%
  # 转换回原始字符串格式的日期
  mutate(Start = format(Start, "%d/%m/%Y"))
验证结果

运行上述代码后,输出与期望完全一致:

# A tibble: 4 × 6
  Name     ID Start      Code1 City  Real.Start
  <chr> <int> <chr>      <chr> <chr> <chr>     
1 Jack    111 24/3/2022  def   City2 25/3/2022 
2 Jack    111 24/3/2022  efg   City3 26/3/2022 
3 Jack    222 28/3/2022  hij   City4 28/3/2022 
4 Jack    333 31/3/2022  abc   City1 8/4/2022  

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:53:13