R语言技术问询:同日期数据合并为一行及三角法数据构建
R语言问题解决方案
一、相同日期数据分组合并到同一行
根据数据结构分两种场景处理:
场景1:同一日期对应不同变量的记录
如果原始数据是长格式(每个日期对应不同变量的多条记录),用tidyr::pivot_wider转成宽格式,将相同日期的记录合并到一行:
# 示例原始数据 df <- data.frame( date = c("2023-01-01", "2023-01-01", "2023-01-02"), variable = c("sales", "profit", "sales"), value = c(1000, 200, 1200) ) # 合并为宽格式 library(tidyr) wide_df <- pivot_wider(df, names_from = variable, values_from = value)
场景2:同一日期同一变量有重复记录
如果同一日期的同一指标有多条记录,先聚合(求和、均值等)再合并,用dplyr分组处理:
# 示例原始数据 df <- data.frame( date = c("2023-01-01", "2023-01-01", "2023-01-02"), sales = c(500, 500, 1200) ) # 分组聚合合并 library(dplyr) agg_df <- df %>% group_by(date) %>% summarize(sales_total = sum(sales), .groups = "drop")
二、构造三角法(损失三角)数据
你需要的是精算领域常用的损失三角结构,通过长格式数据转宽格式即可实现,自动填充右上角的NA:
步骤1:准备长格式原始数据
假设原始数据包含origin(事故年)、dev(发展期)、value(赔付金额)三列:
tri_long <- data.frame( origin = c(2005,2005,2005,2005,2006,2006,2006,2007,2007,2008), dev = c(1,2,3,4,1,2,3,1,2,1), value = c(1500,2420,2720,3020,1150,1840,2070,1650,2640,1740) )
步骤2:转换为三角矩阵格式
用tidyr::pivot_wider直接转换,缺失的发展期自动填充NA,再调整行名列名匹配需求:
library(tidyr) library(dplyr) # 转宽格式 tri_wide <- tri_long %>% pivot_wider(names_from = dev, values_from = value) %>% arrange(origin) # 调整为示例格式(origin为行名,dev为列名) tri_final <- tri_wide %>% column_to_rownames("origin") colnames(tri_final) <- 1:4 # 查看结果 print(tri_final)
进阶:自动生成所有可能的origin-dev组合
如果原始数据缺少部分origin-dev的空记录,先构造所有可能的组合,再左连接原始数据,确保三角结构完整:
# 生成所有origin和dev的组合 all_combinations <- expand.grid( origin = unique(tri_long$origin), dev = 1:max(tri_long$dev) ) # 左连接填充NA tri_full <- left_join(all_combinations, tri_long, by = c("origin", "dev")) %>% pivot_wider(names_from = dev, values_from = value) %>% arrange(origin) %>% column_to_rownames("origin")
运行后得到的结果和你手动构造的完全一致。
内容的提问来源于stack exchange,提问作者محمد الشهري
相关产品推荐
相关产品推荐

