【发布时间】:2017-07-13 16:14:29
【问题描述】:
我在 R 中执行每个保单的人寿保险估值。每月现金流量预测是按保单执行的,并返回以下格式的数据框(例如):
Policy1 = data.frame(ProjM = 1:200,
Cashflow1 = rep(5,200),
Cashflow2 = rep(10,200))
我的模型返回一个列表(使用 lapply 和一个执行每个保单现金流预测的函数 - 基于每个保单的各种细节、升级假设和生活意外事件)。我想通过ProjM 汇总所有保单的现金流。下面的代码做我想要的,但寻找一种更有效的内存方式(即不使用rbindlist 函数)。示例数据:
Policy1 = data.frame(ProjM = 1:5,
Cashflow1 = rep(5,5),
Cashflow2 = rep(10,5))
Policy2 = data.frame(ProjM = 1:3,
Cashflow1 = rep(50,3),
Cashflow2 = rep(-45,3))
# this is the output containing 35000 data frames:
ListOfDataFrames = list(Policy1 = Policy1, Policy2 = Policy2)
我的代码:
library(data.table)
OneBigDataFrame <- rbindlist(ListOfDataFrames)
MyOutput <- aggregate(. ~ ProjM, data = OneBigDataFrame, FUN = sum)
需要输出:
ProjM Cashflow1 Cashflow2
1 55 -35
2 55 -35
3 55 -35
4 5 10
5 5 10
我找过例子,R aggregate list of dataframe对所有数据帧进行聚合,但不要将它们合并为1个数据帧。
【问题讨论】:
-
由于内存限制,您是否希望 避免 使用您的所有 输入 数据创建一个大 data.frame,但将聚合值放在一个中输出 data.table? BTW:如果您已经在使用
data.table,为什么不继续使用data.table语法进行聚合? -
我通过使用矩阵找到了最好的解决方案:
ListOfMatrices = list(Policy1 = as.matrix(Policy1), Policy2 = as.matrix(Policy2))OneBigMatrix = do.call(rbind,ListOfMatrices)MyOutputNew = rowsum(OneBigMatrix[,2:3], group = OneBigMatrix[,1])MyOutputNew没有ProjM,但主要是我想使用Cashflow1和Cashflows2等
标签: r list dataframe sum aggregate-functions