如何将分组中最新年份的值映射至组内每一行?
问题描述
我有一个包含不同国家各年份数据的大型数据集,希望新增一列填入对应国家最新年份的数值。曾尝试通过ifelse循环筛选最新年份(多数为2023或2022)的数据,再与主数据集合并,但出现大量重复项,想找不依赖筛选/合并的解决方法。
模拟数据
countries <- c('A','A','A','B','B','C') years <- c('2000','2001','2002','1999','2001','2000') values <- c(1,3,1,2,3,2) df <- data.frame(countries,years,values)
原数据集:
| 国家ID | 年份 | 数值 |
|---|---|---|
| A | 2000 | 1 |
| A | 2001 | 3 |
| A | 2002 | 1 |
| B | 1999 | 2 |
| B | 2001 | 3 |
| C | 2001 | 2 |
期望结果
新增Latest_Value列:
| 国家ID | 年份 | 数值 | 最新年份数值 |
|---|---|---|---|
| A | 2000 | 1 | 1 |
| A | 2001 | 3 | 1 |
| A | 2002 | 1 | 1 |
| B | 1999 | 2 | 3 |
| B | 2001 | 3 | 3 |
| C | 2001 | 2 | 2 |
解决方案
方法1:使用dplyr分组处理
推荐用dplyr的分组函数直接在原数据集上计算,无需额外筛选合并:
library(dplyr) # 先把年份转成数值型,方便比较大小 df <- df %>% mutate(years = as.numeric(years)) %>% group_by(countries) %>% mutate(Latest_Value = values[which.max(years)]) %>% ungroup() # 若需要保留年份的字符格式,可转回 df <- df %>% mutate(years = as.character(years))
核心逻辑:
- 按国家分组后,用
which.max(years)定位每组中最新年份的行 - 提取该行的
values值,赋值给整组的Latest_Value列
方法2:使用Base R处理
如果不想加载额外包,用ave函数也能实现相同效果:
# 转换年份为数值型 df$years <- as.numeric(df$years) # 按国家分组,计算每组最新年份对应的数值 df$Latest_Value <- ave(df$values, df$countries, FUN = function(x, y) x[which.max(y)], y = df$years) # 转回字符型年份(按需选择) df$years <- as.character(df$years)
内容的提问来源于stack exchange,提问作者Balthazar de Robiano
相关产品推荐
相关产品推荐

