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
相关产品推荐
相关产品推荐

