如何在R中按DataReferencia分组筛选DataFrame的最新数据?
解决方案:按参考月份分组提取最新估计行
你的核心问题是分组依据错误,且aggregate不适合直接提取完整行(它会对每列单独聚合,导致列值不匹配)。下面提供两种常用的实现方式:
一、用dplyr包(推荐,代码直观易读)
先确保安装并加载dplyr:
install.packages("dplyr") library(dplyr)
方法1:筛选每组最新日期的行
Cambio_PorDataRef <- base_cambio %>% group_by(DataReferencia) %>% # 按参考月份分组 filter(Data == max(Data)) %>% # 筛选每组中估计日期最新的行 ungroup() # 取消分组状态
方法2:用slice_max更简洁
如果每组中最新日期可能有重复行,slice_max可以指定取前N行(这里N=1):
Cambio_PorDataRef <- base_cambio %>% group_by(DataReferencia) %>% slice_max(n = 1, order_by = Data) %>% # 按Data降序取每组第一行 ungroup()
二、Base R实现(无需额外包)
方法1:先获取每组最新日期,再匹配原数据
# 第一步:计算每个参考月份对应的最新估计日期 max_dates <- aggregate(Data ~ DataReferencia, data = base_cambio, FUN = max) # 第二步:匹配原数据,提取对应完整行 Cambio_PorDataRef <- merge(base_cambio, max_dates, by = c("DataReferencia", "Data"))
方法2:排序后去重保留每组最后一行
# 先按参考月份、估计日期升序排序 base_cambio_sorted <- base_cambio[order(base_cambio$DataReferencia, base_cambio$Data), ] # 从后往前去重,保留每个参考月份的最后一行(即最新日期行) Cambio_PorDataRef <- base_cambio_sorted[!duplicated(base_cambio_sorted$DataReferencia, fromLast = TRUE), ]
为什么你的原代码出错?
你之前的aggregate把分组依据写成了base_cambio$Data,这完全搞反了逻辑——应该按DataReferencia分组,而不是按估计日期。另外,aggregate会对每一列单独计算最大值,导致最终结果的列值来自不同的行,自然会出现重复的DataReferencia,且数据完全不符合预期。
内容的提问来源于stack exchange,提问作者Matheus Cruz
相关产品推荐
相关产品推荐

