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

如何用dplyr::mutate获取每个name对应最大日期的value并重复显示

用dplyr实现连续分组内最大日期对应值的重复填充

需求说明:为连续相同的names分组,提取每组中最大dates对应的value,并将该值填充到组内所有行的新列中。

方法1:结合data.table的rleid快速分组

library(dplyr)
library(data.table) # 用于生成连续分组标识

set.seed(1234)
df <- data.frame(
  dates = seq.Date(as.Date("2022-08-23"), 
                   as.Date("2022-09-11"),
                   by = "days"),
  names = c(
    "a", "a", "b", "c", "a", "a", "c", "b", "a", "a",
    "b", "c", "a", "b", "c", "d", "b", "a", "b", "c"   
  ),
  value = rnorm(20,0,1)
)

# 生成结果
df_result <- df %>%
  # 为连续相同的names创建唯一分组ID
  mutate(group_id = rleid(names)) %>%
  group_by(group_id) %>%
  # 提取组内最大日期对应的value,填充到新列
  mutate(max_date_value = value[which.max(dates)]) %>%
  ungroup() %>%
  # 可选:移除临时分组ID列
  select(-group_id)

# 查看结果
head(df_result, 10)

方法2:纯dplyr实现(无需额外包)

df_result <- df %>%
  # 用cumsum生成连续分组标识:当前行names与前一行不同时,分组ID递增
  mutate(group_id = cumsum(names != lag(names, default = first(names)))) %>%
  group_by(group_id) %>%
  mutate(max_date_value = value[which.max(dates)]) %>%
  ungroup() %>%
  select(-group_id)

# 查看完整结果
df_result

关键逻辑说明

  • rleid(names)或纯dplyr的cumsum逻辑,都是为连续重复的names生成唯一分组ID,确保同一"连续name段"被归为一组。
  • which.max(dates)在分组内定位最大日期的行索引,value[which.max(dates)]提取对应值后,会自动填充到当前分组的所有行中。

内容的提问来源于stack exchange,提问作者Rodrigo H. Ozon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:25:44