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

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用于忽略前序中的缺失值。
  • 处理全缺失情况:当某列前序年份全为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:14:58