【问题标题】:R: Build custom cumsum function in sapplyR:在 sapply 中构建自定义 cumsum 函数
【发布时间】:2018-04-27 13:45:31
【问题描述】:

我正在尝试构建一个更自定义的 cumsum 版本以在 data.table 上使用,但第一步我失败了:

numbers <- data.table(num=1:10)

sum <- 0

cumFunct <- function(n) {
  sum <<- sum+n
  return(sum)
}

numbers[, cum:=sapply(num, cumFunct)]

虽然这可行,但它非常不干净。在我运行函数之前,它还需要将 sum 设置为 0。

现在,我该如何以更简洁的方式编写它?本质上,如何在不使用全局变量的情况下将中间结果传递给cumFunct 的下一次迭代?

非常感谢!

【问题讨论】:

  • 你可能不应该问怎么做this,但我怎么才能做到this2。你想计算什么?
  • 答案可能取决于您希望如何自定义 cumsum 函数;也许您的自定义可以应用于 cumsum 的输出,例如 numbers[, cum:=2*cumsum(num)]
  • 嘿 - 不,它会涉及更多。上下文是计算回报系列的绩效费用,当我通过行时,我需要随身携带一些变量。
  • 更具体地说:我有一个从 0 开始并根据特定函数逐行增加的高水位线图,并根据我需要计算的高水位线的水平我对特定行的结果。我可以在没有存储此高水位标记的全局变量的情况下实现此目的吗?即,我可以在遍历行时继续传递它吗?

标签: r data.table sapply cumsum


【解决方案1】:

一种方法是在函数中使用数据表“数字”:

numbers <- data.table(num=1:10)

cumFunct <- function(n) {
  sum <- sum(numbers[1:n])
  return(sum)
}

numbers[, cum:=sapply(num, cumFunct)]

这不是最有效的方法,但取决于您在自定义代码中所做的事情,可以改进它。

【讨论】:

  • 谢谢 - 抱歉,我的例子很简单,不会让你对金融数学感到厌烦,但最终的计算将比从 1 到 n 求和复杂得多 :-)
【解决方案2】:

一个也是一个问题的答案:这是一种适用于这里的模式吗?

complicated.wizardry <- function(a,b){
    a+b
}

cumlist <- function(sofar, remaining, myfn){
    if(length(remaining)==1)return(c(sofar, myfn(sofar[length(sofar)],remaining[1])))
    return (  cumlist( c(sofar, myfn(sofar[length(sofar)],remaining[1])),remaining[2:length(remaining)],myfn))
    }

cumlist(0,1:10,complicated.wizardry)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多