大型data.table的行向累积乘积计算优化与基准测试问询
高效计算行向累积乘积的data.table实现方案
问题背景
你有一个1000列、100,000行的大型data.table,列代表每日死亡率,需要计算月度生存率(即每日生存率的30次方的行向累积乘积)。当前使用Reduce的方法,尝试过转置后用cumprod但速度极慢,寻求更高效的实现方式。
构造数据代码(修正为10万行)
library(data.table) dt <- data.table(col1 = runif(1e5)) for (i in 2:1000) { set(dt, j = paste('col', i, sep = ''), value = dt[[i-1]] * 0.95^(i-1)) }
高效实现方法
利用matrixStats包的rowCumprod函数(底层C实现,行向累积乘积效率远高于纯R层面的循环/转置操作),步骤如下:
- 加载依赖包
library(matrixStats)
- 提取目标列并转换为矩阵
# 提取所有每日死亡率列 death_mat <- as.matrix(dt[, paste0("col", 1:1000), with = FALSE])
- 计算月度生存率因子(每日生存率的30次方)
surv_factor <- (1 - death_mat)^30
- 行向累积乘积得到月度生存率
cum_surv_mat <- rowCumprod(surv_factor)
- 将结果赋值回原data.table
dt[, paste0("surv_rate_", 1:1000) := as.data.table(cum_surv_mat)]
效率对比说明
- 原
Reduce方法:在R层面逐列进行累积乘积操作,列数较多时(1000列)会产生大量R层面的循环开销。 - 转置
cumprod方法:两次转置10万行×1000列的矩阵会占用极大内存,且转置本身是高开销操作,速度极慢。 matrixStats方案:通过底层C实现行向累积,完全避免R层面循环和转置开销,内存使用更高效,速度提升显著。
内容的提问来源于stack exchange,提问作者Algebro1000
相关产品推荐
相关产品推荐

