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

R语言按企业、年月分组提取价格字段月末最后一条观测值

R语言按分组提取每组最新日期对应记录的实现方案

首先修正你原数据构造代码的两处语法错误:

  1. 字符型取值A、B需要加引号
  2. as.data.frame构造多列数据框的参数写法有误,原代码运行会报错

正确的数据集构造代码:

id <- c("A","A","B","B")
date <- as.Date(c("21/10/2011","22/10/2011","23/10/2011","24/10/2011"), format = "%d/%m/%Y")
price <- c(1,2,3,4)
df <- data.frame(id,date,price)

方法1:dplyr实现(可读性高,最常用)

需要先加载dplyr包,提取年月可以用lubridate包也可以用base R的format函数:

# 未安装包先执行 install.packages(c("dplyr","lubridate"))
library(dplyr)
library(lubridate)

result <- df %>%
  # 按id、年、月分组,不用lubridate的话可替换为group_by(id, format(date, "%Y"), format(date, "%m"))
  group_by(id, year(date), month(date)) %>%
  # 筛选每组内日期最大的行,若存在多条同最大日期的记录只需返回1条,可替换为slice_max(date, n = 1, with_ties = FALSE)
  filter(date == max(date)) %>%
  ungroup() %>%
  # 调整日期输出格式匹配你的要求
  mutate(date = format(date, "%d/%m/%Y")) %>%
  select(id, date, price)

方法2:base R实现(无需额外安装包)

# 生成分组标识
df$group <- paste(df$id, format(df$date, "%Y%m"), sep = "_")
# 按分组取最大日期对应的记录
result <- do.call(rbind, lapply(split(df, df$group), function(x) {
  max_row <- x[x$date == max(x$date), ]
  max_row$date <- format(max_row$date, "%d/%m/%Y")
  return(max_row[, c("id", "date", "price")])
}))
rownames(result) <- NULL

两种方法运行后得到的result均和你给出的预期输出一致。

内容的提问来源于stack exchange,提问作者thomas.diridondo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:45:02