【发布时间】:2014-06-11 22:04:23
【问题描述】:
我想做一个函数来做以下事情:
c <- rnorm(100)
n <- 10
sum.diff<- integer(n)
for (k in 1:n) {
sum.diff[k] <- sum(diff(c, lag=k))
}
通过矢量化而不是循环。具体来说,我想发送一个向量(这里是'c')和一个滞后值向量(这里是'1:n'),并得到第k个条目中第k个差异的总和输出向量(此处为“sum.lags”)。
例如,c <- 1:100 和 n <- 10 应该产生:
99
196
291
...
900
对应于:
sum(diff(1:100,lag=1))
sum(diff(1:100,lag=2))
sum(diff(1:100,lag=3))
...
sum(diff(1:100,lag=10))
有任何想法吗?
【问题讨论】:
-
我可以想办法用
sapply来代替for循环,但它并没有真正矢量化,也不是更快(事实上,有点慢)。将这个向量化的问题是每次迭代都要处理不同数量的数字。您是否希望矢量化,因为您的生产代码正在处理相当大的数据集?如果是这样,我会推荐compiler::cmpfun,或者更好的是 Rcpp。 -
这是一个更大的数据集(因此非常慢),但它是针对一个特定的问题,可能不值得投入那么多时间。证明 rpp 的合理性有点困难(我有从未使用过它,但一直渴望学习它,虽然我确实有 C++ 经验),但我会检查两者。如果不出意外,它可以作为一种熟悉我应该知道的事情的方式。谢谢!
-
带有“sugar”和类似 R 语法的 Rcpp 并不难学。如果您已经有一些 c++ 经验,那么学习 Rcpp 可能会比您想象的要容易得多。 (顺便说一句:编码“最佳实践”通常不鼓励使用
c作为变量名......它有效,但是......) -
谢谢,这令人鼓舞。是的,我只使用
c来回答这个问题。我的代码中的实际变量名是ln.pre.grid,但谢谢:) -
无法理解“输出向量的第 k 个条目中的滞后总和”的含义。该代码显然是不正确的,并且没有真正的帮助。请指定一个小的可重现数据集和“正确”答案。
标签: r vector vectorization