R语言:如何优雅按分组获取数据框的最新记录?
优雅实现按分组取最新分数的方案
嘿,这个分组获取最新记录的需求很常见,用dplyr搭配lubridate的实现方式既简洁又易读,绝对符合你要的「优雅」标准。下面给你两种方案,其中第二种更直接:
方案一:排序后取首行
先把字符型日期转换成标准日期格式,再按姓名分组、日期降序排序,最后取每组第一行:
# 加载必要的包 library(dplyr) library(lubridate) # 原始数据 df <- data.frame(Xdate = c("21-jul-2020", "29-jul-2020", "20-jul-2020", "13-may-2020" ), names = c("peter", "lisa","peter", "lisa"), score = c(1,3,5,7)) # 处理流程 df_result <- df %>% mutate(Xdate = dmy(Xdate)) %>% # 自动识别日-月-年格式,转成日期类型 group_by(names) %>% # 按姓名分组 arrange(desc(Xdate)) %>% # 每组内按日期降序,最新日期排在最前 slice_head(n = 1) %>% # 取每组第一行 ungroup() %>% # 取消分组,回到普通数据框 select(names, score) # 保留需要的列
方案二:直接用slice_max()(更推荐)
dplyr的slice_max()函数可以直接筛选出每组中指定变量最大的行,一步到位,逻辑更清晰:
df_result <- df %>% mutate(Xdate = dmy(Xdate)) %>% group_by(names) %>% slice_max(Xdate, n = 1) %>% # 直接取每组日期最大的记录 ungroup() %>% select(names, score)
验证结果
运行后得到的df_result完全符合你的期望:
> df_result # A tibble: 2 × 2 names score <chr> <dbl> 1 peter 1 2 lisa 3
为什么说这是优雅的实现?
- 管道操作
%>%让数据处理流程从左到右连贯呈现,可读性极强; lubridate::dmy()无需手动指定格式字符串,自动识别日-月-年的日期格式,减少出错;slice_max()直接对应「取最新日期记录」的需求,代码意图一目了然,比手动排序再取行更直观。
内容的提问来源于stack exchange,提问作者Soren Christensen
相关产品推荐
相关产品推荐

