【问题标题】:using last sapply output as next input使用最后一个 sapply 输出作为下一个输入
【发布时间】:2015-07-12 15:45:18
【问题描述】:

我想以 sapply 的最新输出值成为 sapply 的下一个输入的方式使用 sapply。在下面的示例中,我创建了向量 a=(1, NA, NA, NA),并希望 sapply 返回向量 a=(1,1,2,2)。基本上,对于 a[2:4],我希望输出为 2-1=2, 3-1=2, 4=2=2

a <- NA
a[1] <- 1
a[2:4] <- sapply(2:4, function(x) x- a[x-1])

如果您运行它,您会看到它返回 a=(1,1,NA,NA),因为它使用现有的 a 向量而不是“实时”向量。

作为一个for循环,它的工作原理是这样的:

a <- NA
a[1] <- 1
for (ii in 2:4){
  a[ii] <- ii-a[ii-1]
}

之所以要使用 sapply 是因为我的真实函数很复杂,而且会运行在大型数据集上,我不想等待很长时间。

谢谢。

【问题讨论】:

  • 使用sapply 而不是编写良好的for 循环,您不太可能显着提高速度。我不明白2-1=2, 3-1=2, 4=2=2
  • sapply 不会这样做,即使可以,它也不会比编写良好、预先分配的 for 循环快得多。您的问题可能会被矢量化,但如果没有看到您的“真实”功能,就不可能知道。否则,对于强烈依赖于前一次迭代的计算,我强烈建议使用 Rcpp 来提高速度。
  • @docendo 对不起,这是一个错字。应该是 2-1=2、3-1=2、4-2=2。我意识到这不是很清楚。显示的循环覆盖了它。

标签: r lapply sapply


【解决方案1】:

您可以为此使用函数Reduce

Reduce(f=function(lhs,rhs) rhs-lhs,x=1:4,accumulate=TRUE)
#[1] 1 1 2 2

请注意,如果您在大数据上运行它会很慢。

那么最好预先分配一个向量并通过for 循环填充它(正如@joran 建议的那样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2017-03-05
    • 2019-11-29
    • 2018-11-22
    相关资源
    最近更新 更多