如何用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
相关产品推荐
相关产品推荐

