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

R语言按ID计算跨时段ln_rd平均值的实现问题

Hey there! 很高兴你已经想到用dplyr分组,这思路完全找对了方向——排序后结合年份索引(或者移位变量)确实能完美解决你的需求,咱们一步步来实现:

核心思路

你的需求本质是在每个id组内,根据该id的最早观测年份,选取对应两个年份的ln_rd计算平均值。用dplyr的话,只要先把每个id内的年份按顺序排好,再针对性提取数值计算就行。

代码实现

假设你的数据框名为df,包含id、year、ln_rd三个核心变量,代码如下:

library(dplyr)

df_final <- df %>%
  # 第一步:按id分组,组内按年份升序排序(确保1991→1999→2007的顺序)
  group_by(id) %>%
  arrange(year, .by_group = TRUE) %>%
  # 第二步:标记每个id的首个有效ln_rd观测年份(若所有ln_rd无缺失,直接用first(year)即可)
  mutate(first_obs_year = first(year[!is.na(ln_rd)])) %>%
  # 第三步:根据首个观测年份计算目标平均值
  mutate(avg_ln_rd = case_when(
    # 首个观测在1999年:取1999和1991年的ln_rd平均值
    first_obs_year == 1999 ~ mean(c(ln_rd[year == 1999], ln_rd[year == 1991]), na.rm = TRUE),
    # 首个观测在2007年:取2007和1999年的ln_rd平均值
    first_obs_year == 2007 ~ mean(c(ln_rd[year == 2007], ln_rd[year == 1999]), na.rm = TRUE),
    # 额外处理:若首个观测在1991年(你没提但可能存在),可按需调整规则
    TRUE ~ mean(c(ln_rd[year == 1991], ln_rd[year == 1999]), na.rm = TRUE)
  )) %>%
  # 可选:取消分组(方便后续其他操作)
  ungroup()

代码细节解释

  1. arrange(year, .by_group = TRUE):这是关键步骤,确保每个id内的年份严格按时间顺序排列,后续提取年份值时不会混乱。.by_group = TRUE保证排序仅在当前id组内进行,不会打乱分组结构。
  2. first(year[!is.na(ln_rd)]):精准定位每个id中第一个有有效ln_rd值的年份;如果你的数据里所有ln_rd都没有缺失,直接简化成first(year)就行。
  3. case_when逻辑:通过年份索引直接提取对应年份的ln_rd值,na.rm = TRUE能自动忽略可能的缺失值,避免计算报错。

关于移位变量的补充

如果你特别想用移位变量(比如lag()或lead())实现,也可以尝试——比如当某个id只有1999和2007两个年份时,排序后ln_rd的第一个值是1999年的,第二个是2007年的,这时候mean(c(ln_rd, lag(ln_rd)), na.rm = TRUE)也能得到平均值。但这种方法依赖固定的年份组合,灵活性不如直接按年份索引,所以更推荐上面的写法。

内容的提问来源于stack exchange,提问作者lex_022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:50:22