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

R语言按id分组后,以2020年1月val为基准计算索引值

按ID分组计算基于2020年1月的Val索引值

原始数据示例:

id  year  month  val
1   2020  1      50
1   2020  7      80
1   2021  1      40
1   2021  7      70
...

需求:按id分组,以每个id对应2020年1月的val为基准,将所有val转换为100 * 当前val / 基准val的索引值,最终结果如下:

id  year  month  val
1   2020  1      100
1   2020  7      160
1   2021  1      80
1   2021  7      140
...

问题分析

你之前的错误在于在mutate中直接嵌套针对整个数据集的过滤操作,这会导致分组后无法正确匹配当前id对应的基准值——嵌套操作不会识别分组上下文,只会返回全局的过滤结果。

解决方案一:分组内直接筛选基准值

这是最简洁的写法,在分组后直接提取当前组的2020年1月val作为基准:

df %>%
  group_by(id) %>%
  mutate(val = 100 * val / first(val[year == 2020 & month == 1])) %>%
  ungroup() # 可选,根据后续操作需求决定是否取消分组
  • val[year == 2020 & month == 1]会在当前分组中筛选出符合条件的基准值
  • first()确保即使同一id存在多条2020年1月的记录(你的数据里没有这种情况),也能取到唯一值用于计算

解决方案二:先提取基准值再做连接

如果需要单独复用基准值,或者数据量较大时,这种方法逻辑更清晰:

# 第一步:提取每个id的2020年1月基准值
base_values <- df %>%
  filter(year == 2020, month == 1) %>%
  select(id, base_val = val)

# 第二步:连接原始数据并计算索引
df %>%
  left_join(base_values, by = "id") %>%
  mutate(val = 100 * val / base_val) %>%
  select(-base_val) # 删除临时基准列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:20:37