跨分组去除重复数据:基于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分组后保留每组内日期最晚的行,步骤如下:
- 将
Start列转换为日期格式,确保能正确比较早晚 - 按
Code1分组,筛选出每组中Start最晚的行 - 转换回原始日期字符串格式并按
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
相关产品推荐
相关产品推荐

