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

R语言:在数据框同组内插入均值新行并生成对应item

R语言数据框分组插入相邻百分比均值行的实现方法

模拟样本数据

先构造符合需求的样本数据(与实际数据结构对齐):

library(tidyverse)

sample_df <- tibble(
  datestamp = rep(c("2023-01-01", "2023-02-01"), each = 6),
  item = c("3MTH_90%", "3MTH_100%", "6MTH_80%", "6MTH_90%", "6MTH_100%", "12MTH_90%",
           "3MTH_90%", "3MTH_100%", "6MTH_80%", "6MTH_90%", "6MTH_100%", "12MTH_90%"),
  value = c(1.2, 1.5, 2.0, 2.2, 2.5, 3.0,
            1.3, 1.6, 2.1, 2.3, 2.6, 3.1)
)

核心实现代码

使用tidyverse工具链完成分组、均值计算和行插入:

result_df <- sample_df %>%
  # 拆分item为期限(tenor)和百分比(pct),提取百分比数值
  separate(item, into = c("tenor", "pct"), sep = "_") %>%
  mutate(pct_num = as.numeric(str_remove(pct, "%"))) %>%
  # 按日期+期限分组,每组内按百分比从小到大排序
  group_by(datestamp, tenor) %>%
  arrange(pct_num, .by_group = TRUE) %>%
  # 计算相邻行的均值,生成新行的item和value
  mutate(
    next_pct = lead(pct_num),
    next_val = lead(value),
    new_pct = (pct_num + next_pct)/2,
    new_val = (value + next_val)/2,
    new_item = paste0(tenor, "_", new_pct, "%")
  ) %>%
  # 筛选出有效生成的均值行(排除每组最后一行,因为没有下一行)
  filter(!is.na(new_item)) %>%
  select(datestamp, item = new_item, value = new_val) %>%
  # 合并原数据和新生成的均值行
  bind_rows(sample_df) %>%
  # 重新排序,恢复按日期、期限、百分比的顺序
  separate(item, into = c("tenor", "pct"), sep = "_") %>%
  mutate(pct_num = as.numeric(str_remove(pct, "%"))) %>%
  arrange(datestamp, tenor, pct_num) %>%
  # 移除辅助列,保留原结构列
  select(datestamp, item, value) %>%
  ungroup()

# 查看结果
print(result_df)

关键步骤说明

  1. 拆分item列:把item拆分为期限(如3MTH)和百分比(如90%),提取百分比的数值用于排序和计算。
  2. 分组排序:按datestamp和tenor分组,每组内按百分比数值排序,确保相邻行是连续的百分比区间。
  3. 生成均值行:用lead()获取下一行的百分比和数值,计算两者的均值,构造新的item名称(如3MTH_95%)。
  4. 合并与排序:将生成的均值行和原数据合并,最后重新排序保证结果的有序性。

适配调整

如果你的item格式不是期限_百分比(比如百分比在前),只需调整separate函数的参数,拆分出对应的期限和百分比字段即可。

内容的提问来源于stack exchange,提问作者The Prescient Robot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:40:36