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)
关键步骤说明
- 拆分item列:把
item拆分为期限(如3MTH)和百分比(如90%),提取百分比的数值用于排序和计算。 - 分组排序:按
datestamp和tenor分组,每组内按百分比数值排序,确保相邻行是连续的百分比区间。 - 生成均值行:用
lead()获取下一行的百分比和数值,计算两者的均值,构造新的item名称(如3MTH_95%)。 - 合并与排序:将生成的均值行和原数据合并,最后重新排序保证结果的有序性。
适配调整
如果你的item格式不是期限_百分比(比如百分比在前),只需调整separate函数的参数,拆分出对应的期限和百分比字段即可。
内容的提问来源于stack exchange,提问作者The Prescient Robot
相关产品推荐
相关产品推荐

