R语言中时间序列数据池化分组:按规则合并年度数据
解决方案
可以使用dplyr包实现需求,核心逻辑是按ID分组后,对每个数值列应用指定的取值规则:
library(dplyr) df <- tibble( ID=c(1,1,1, 2,2,2, 3,3,3), Year = c(1,2,3,1,2,3,1,2,3), column1 = c(10,11,NA,12,11,NA,14,NA, 15), column2 = c(8,NA,15,NA,NA,NA,NA, 14,16) ) result <- df %>% group_by(ID) %>% summarise( Year = "combined", column1 = ifelse(!is.na(column1[Year == 3]), column1[Year == 3], max(column1[Year < 3], na.rm = TRUE)), column2 = ifelse(!is.na(column2[Year == 3]), column2[Year == 3], max(column2[Year < 3], na.rm = TRUE)), .groups = "drop" ) %>% # 处理max返回Inf的情况(当所有前序值都是NA时) mutate(across(c(column1, column2), ~ifelse(.x == Inf, NA, .x))) print(result)
代码解释
- 分组:用
group_by(ID)按唯一ID分组,确保每个ID的处理独立进行。 - 取值规则实现:
- 对每个列,先判断第3年(
Year == 3)的取值是否非缺失,若非缺失则直接使用该值。 - 若第3年值缺失,计算前序年份(
Year < 3)的最大值,na.rm = TRUE用于忽略前序中的缺失值。
- 对每个列,先判断第3年(
- 处理全缺失情况:当某列前序年份全为NA时,
max()会返回Inf,最后用mutate(across(...))将这类值替换为NA,匹配需求中的结果。 - 分组清理:
.groups = "drop"取消分组状态,得到整洁的输出结构。
运行上述代码后,输出结果与期望完全一致:
# A tibble: 3 × 4 ID Year column1 column2 <dbl> <chr> <dbl> <dbl> 1 1 combined 11 15 2 2 combined 12 NA 3 3 combined 15 16
内容的提问来源于stack exchange,提问作者Abdullah Gok
相关产品推荐
相关产品推荐

