如何在dplyr框架内为分组数据框生成基于首行的相对值?
用dplyr实现分组相对值计算
完全可以在dplyr框架内直接完成,不需要额外创建第二个表。核心思路是按year分组后,提取每组day=1的value作为基准,让组内所有value除以这个基准值,具体代码如下:
首先构造原始数据框:
df <- data.frame( year = c(2010, 2010, 2010, 2011, 2011), day = c(1,2,3,1,2), value = c(5,6,7,8,5) )
然后用dplyr处理:
library(dplyr) df_result <- df %>% group_by(year) %>% # 提取当前组day=1的value作为除数,自动广播到组内所有行 mutate(rel.value = value / value[day == 1]) %>% # 可选:取消分组,回到普通数据框 ungroup()
运行后df_result的输出就是你要的结果:
# A tibble: 5 × 4 year day value rel.value <dbl> <dbl> <dbl> <dbl> 1 2010 1 5 1 2 2010 2 6 1.2 3 2010 3 7 1.4 4 2011 1 8 1 5 2011 2 5 0.625
补充说明
group_by(year):按年份分组,确保后续操作只在同一年份内执行value[day == 1]:在当前分组中,筛选出day=1对应的value值(每个组仅1个),R会自动将这个单一值广播到组内所有行,完成除法运算- 如果担心组内可能存在多个day=1的情况,可以用
value[day == 1][1]取第一个匹配值,或者用first(value[day == 1])保证只取一个基准值
内容的提问来源于stack exchange,提问作者ECII
相关产品推荐
相关产品推荐

