如何使用apply与mutate函数创建新变量?基于分组数据的组内比值计算需求
解决方案:用dplyr快速实现分组后按组首值计算新变量
嘿,你这个需求其实用dplyr自带的函数就能轻松解决,不用折腾apply啦!咱们直接在你已经分组的基础上,用mutate结合first()函数就能搞定。
完整代码示例
library(dplyr) # 先创建你的数据框 df <- data.frame( name = c(rep("AUS",5), rep("FRA",5), rep("SPA",5)), Date = rep(seq(as.Date("2020/1/1"), as.Date("2020/1/5"), "days"),3), mean = c(19, 2, 22, 13, 23, 24, 7, 14, 27, 30, 4, 26, 1, 18, 5) ) # 分组后计算新变量 df <- df %>% group_by(name) %>% mutate(new_var = first(mean) / mean) %>% ungroup() # 记得取消分组,避免后续操作受影响 # 查看结果 print(df)
为什么这个方法有效?
group_by(name)已经把数据按国家分组了,接下来mutate里的first(mean)会自动提取每组的第一个mean值,比如AUS组就是19,FRA组是24,SPA组是4。- 然后用这个组首值除以当前行的
mean,就得到了你想要的结果:每组第一行是组首值/组首值=1,后面的行依次是组首值/对应行mean,完全符合你的需求。
结果预览
你会看到新变量new_var的取值和你预期的一致:
# A tibble: 15 × 4 name Date mean new_var <chr> <date> <dbl> <dbl> 1 AUS 2020-01-01 19 1 2 AUS 2020-01-02 2 9.5 3 AUS 2020-01-03 22 0.864 4 AUS 2020-01-04 13 1.46 5 AUS 2020-01-05 23 0.826 6 FRA 2020-01-01 24 1 7 FRA 2020-01-02 7 3.43 8 FRA 2020-01-03 14 1.71 9 FRA 2020-01-04 27 0.889 10 FRA 2020-01-05 30 0.8 11 SPA 2020-01-01 4 1 12 SPA 2020-01-02 26 0.154 13 SPA 2020-01-03 1 4 14 SPA 2020-01-04 18 0.222 15 SPA 2020-01-05 5 0.8
内容的提问来源于stack exchange,提问作者Eve Chanatasig
相关产品推荐
相关产品推荐

