R语言按企业、年月分组提取价格字段月末最后一条观测值
R语言按分组提取每组最新日期对应记录的实现方案
首先修正你原数据构造代码的两处语法错误:
- 字符型取值A、B需要加引号
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
相关产品推荐
相关产品推荐

