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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:47:48