代码之家  ›  专栏  ›  技术社区  ›  Joe

如何在data.table中迭代

  •  2
  • Joe  · 技术社区  · 4 年前

    我想计算分组和累积的统计数据,比如下面的模拟,我每天有10个观测值,持续5天,并计算每天的累积标准差。

    library(data.table)
    library(tictoc)
    
    DURATION <- 5
    DAILY_N <- 10
    N_PER_COND <- DURATION * DAILY_N
    
    dt <- 
        data.table(
          day = rep(1:DURATION, each = DAILY_N),
          x = rgamma(n=N_PER_COND, shape=5, scale=25)
        )
    
    cum_stdevs <- vector('double', DURATION)
    
    tic()
    for (i in seq_along(cum_stdevs)) {
        cum_x <- dt[day <= i, x]
        cum_stdevs[i] <- sd(cum_x)
    }
    toc()
    

    有没有一种方法可以在data.table中执行这种操作,而不必求助于for循环?

    即使在for循环中,速度也比使用标准数据帧提高了14倍。

    1 回复  |  直到 4 年前
        1
  •  3
  •   ThomasIsCoding    4 年前

    我想你可以试试 sapply 在内部 data.table 喜欢下面

    cum_stdevs <- dt[, sapply(seq_along(cum_stdevs), function(k) sd(x[day <= k]))]