R语言按基金类别分组计算各日期数值滚动增长率
R 数据框分组计算基金各日期数值增长率
核心计算规则
- 按基金(Fund)维度拆分数据,同一基金内按日期从早到晚排序
- 增长率计算公式:
(当期数值 - 上一日期数值) / 上一日期数值 * 100% - 每个基金最早的记录日期没有上期基准值,无法计算增长率,因此示例中仅2022-01-02的记录可生成增长率结果
- 题目给出的预期结果仅展示了A基金的计算行,B、C基金同期增长率按规则可算出分别为50%、30%
构造示例数据
Date <- c("2022-01-01","2022-01-01","2022-01-01","2022-01-02","2022-01-02","2022-01-02") Fund <-c("A","B","C","C","A","B") Values <- c(10,10,10,13,17,15) df <- data.frame(Date, Fund, Values)
实现方法
方法1:dplyr包实现(代码简洁易读,推荐)
library(dplyr) result <- df %>% mutate(Date = as.Date(Date)) %>% # 按基金分组,组内按日期升序排列 group_by(Fund) %>% arrange(Date, .by_group = TRUE) %>% # 取同组上一行的数值计算增长率,格式化为百分比 mutate(`Increase %` = scales::percent((Values - lag(Values))/lag(Values), accuracy = 1)) %>% # 去掉无增长率的基期行,和示例输出逻辑对齐 filter(!is.na(`Increase %`)) %>% # 调整列名、列顺序匹配预期格式 select(Date, Fund, Value = Values, `Increase %`)
运行代码后输出结果如下:
| Date | Fund | Value | Increase % |
|---|---|---|---|
| 2022-01-02 | A | 17 | 70% |
| 2022-01-02 | B | 15 | 50% |
| 2022-01-02 | C | 13 | 30% |
如果需要保留所有日期的完整数据,删除
filter(!is.na(Increase %))行即可,基期记录的增长率列会显示为空值。
方法2:基础R实现(无需安装第三方包)
# 转换日期格式 df$Date <- as.Date(df$Date) # 分组取每个基金上一期的数值 lag_val <- ave(df$Values, df$Fund, FUN = function(x) c(NA, head(x, -1))) # 计算增长率并格式化为百分比 df$`Increase %` <- ifelse( is.na(lag_val), NA, paste0(round((df$Values - lag_val)/lag_val*100, 0), "%") ) # 过滤空值、调整列名得到最终结果 result_base <- df[!is.na(df$`Increase %`), c("Date", "Fund", "Values", "Increase %")] colnames(result_base)[3] <- "Value"
内容的提问来源于stack exchange,提问作者Matias Ochoa
相关产品推荐
相关产品推荐

