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

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 %`)

运行代码后输出结果如下:

DateFundValueIncrease %
2022-01-02A1770%
2022-01-02B1550%
2022-01-02C1330%

如果需要保留所有日期的完整数据,删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:15:45