R语言按id因子分组提取每组最早日期对应行的实操问题
R语言按分组提取每组最早日期对应行的代码修正方案
原有代码问题分析
- 仅使用
mutate(fch = min(fch))只会将分组内所有行的日期统一替换为组内最早日期,没有做行筛选,最终仍会返回全部15行数据,不符合提取单行的需求 - 管道操作中不需要额外指定
data$fch,直接引用列名即可,否则会调用原始全量数据的列,容易出现逻辑错误
修正后可直接运行的代码
推荐使用dplyr内置的slice_min()函数实现,代码简洁且符合需求:
library(dplyr) DF1 <- data %>% # 将字符日期转为日期格式 mutate(fch = as.Date(fch, format = "%d/%m/%Y")) %>% # 按id分组 group_by(id) %>% # 提取每组日期最小的1行,with_ties=FALSE表示若有多个相同最早日期仅取第一行,匹配你的预期结果 slice_min(fch, n = 1, with_ties = FALSE) %>% # 若需要保留原始的日/月/年字符串格式可保留此行,不需要直接删除即可 mutate(fch = format(fch, "%d/%m/%Y")) %>% ungroup()
逻辑等价的filter实现方案(方便理解原理)
如果你想更清晰理解筛选逻辑,可以用filter写法:
library(dplyr) DF1 <- data %>% mutate(fch = as.Date(fch, format = "%d/%m/%Y")) %>% group_by(id) %>% # 筛选出日期等于组内最小日期的行 filter(fch == min(fch)) %>% # 若有多个重复最早日期仅保留第一行 slice(1) %>% mutate(fch = format(fch, "%d/%m/%Y")) %>% ungroup()
两种方案运行后得到的DF1和你给出的预期data_result完全一致。
内容的提问来源于stack exchange,提问作者Cebs
相关产品推荐
相关产品推荐

