【问题标题】:R Efficient recursive calculations for a large datasetR 大型数据集的高效递归计算
【发布时间】:2014-12-02 23:31:52
【问题描述】:

我想取一列数字数据,在这种情况下,范围在 0 到 10 之间,并在迭代的基础上减去一个固定值。在我当前的范例中,每一列代表一个时间步长,并且取决于前一个时间步长 (t-1)。这种依赖性很重要,因为我想定义数字重置为 10 然后再次开始降级的列。我的主要问题是,这对于大型数据集来说效率非常低,我相当确定有一种更快、更具可扩展性的方式来完成这项任务。

df <- data.frame(matrix(data=0,nrow=10,ncol=10))
df[,1] <- data.frame(runif(10,0,10))
df[c(3,5,7),4] <- 10
degradation <- .16
for (year in 2:10){
 df[,year][df[,year]!=10] <- df[,year-1][df[,year]!=10]-degradation
}
df[df<0]<-0

这是一个非常简单且低效的示例,说明了我希望数据的外观。我可能会停留在旧的 Excel 思维方式中,因此我愿意在必要时采用不同的方式来构建数据。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    数据是矩阵,所以不要使用数据框

    m <- matrix(data=0, nrow=10, ncol=10)
    m[,1] <- runif(10, 0, 10)
    m[c(3,5,7), 4] <- 10
    

    通过使用变量(ridx)来表示中间值,避免重复计算;使用二维子集赋值

    degradation <- .16
    for (year in 2:10) {
        ridx <- m[, year] != 10
        m[ridx, year] <- m[ridx, year-1L] - degradation
    }
    

    如果想法是有一个恒定的重置率r,那么在一段时间后任何单独的行都有概率p0 = r 刚刚被重置,p1 = (1 - r) r 1 个时间段前被重置,p2 = (1 - r)^2 r 重置 2 个时间段前,..., pt = (1 - r )^t r 重置 t 个时间段前(这描述了几何分布)。对应的值为x0 = 10, x1 = 10 - d, x2 = 10 - 2 d , ..., xt = 10 - t d。在 t = 10 / d 个时间段之后,如果没有重置,则值为 0。例如,样本非零的概率为 sum_{i = 0}^{i = 10 / d - 1} pi 并且非零行的平均值是 sum_{i = 0}^{i = 10 / d - 1} pi xi。这些(以及从 10 到 0 的各个状态的概率)无需模拟即可轻松计算。

    【讨论】:

    • @gvanderbilt 补充了一点数学分析。
    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2014-11-13
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多