R语言 大数据的逐行累积积.表基准

rta7y2nd  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(143)

假设我有一个大的data.table,大约有1000列和100,000行,如下所示:

dt <- data.table(col1 = runif(10^4))
for (i in 2:10^3) set(dt, j = paste('col', as.character(i), sep = ''), value = dt[[i-1]] * 0.95^(i-1))

可以把这些看作是“每日死亡率”。我想计算每月的存活率,所以我有以下代码块:

dt[, paste0('surv_rate_', 1:10^3) := Reduce('*', (1-dt[, paste0('col', 1:10^3)])^30, accumulate = T)]

我无法找到任何基准上的行明智的累积产品,如上图所示。
你能想到任何更好/更干净/更快的方法来用data.table的方式做这件事吗?
(我也想到了as.data.table(t(cumprod(t(dt))),但对于这种大小的表,这似乎要花很长时间)

mbjcgjjk

mbjcgjjk1#

正如注解中提到的,另一种可能的解决方案是在行沿着使用apply

res1 <- 
 copy(dt)[, paste0('surv_rate_', 1:10^3) := transpose(apply((1-.SD)^30,1,cumprod,simplify=F))] 

res2 <- copy(dt)[, paste0('surv_rate_', 1:10^3) := Reduce('*', (1-dt[, paste0('col', 1:10^3)])^30, accumulate = T)]

all.equal(res1,res2)
[1] TRUE

但是,您的解决方案仍然快30%:

Unit: milliseconds
                                                                                                                   expr       min
          copy(dt)[, `:=`(paste0("surv_rate_", 1:10^3), transpose(apply((1-.SD)^30, 1, cumprod, simplify = F)))] 1011.7095
 copy(dt)[, `:=`(paste0("surv_rate_", 1:10^3), Reduce("*", (1-dt[, paste0("col", 1:10^3)])^30, accumulate = T))]  793.5415
       lq     mean   median       uq      max neval
 1246.993 1743.854 1546.797 2119.166 2772.646    10
 1046.194 1314.569 1249.636 1405.414 2496.858    10

相关问题