将函数应用于序列

时间:2018-01-26 08:56:41

标签: r function

我有一个矢量:

?

我需要计算一个矢量,例如,累积平方和: x <- c(1,2,3,4,5,6,7,8) 其中:y <- c(a1, a2, a3...); a1 = 1^2; a2 = 1^2+2^2等等。

这就像“cumsum”,但我需要计算我的功能(不仅是sqares的总和,而是任何),就像这样。

谢谢!

2 个答案:

答案 0 :(得分:4)

首先对元素进行平方,而不是采用累计和:

y <- cumsum(x^2)

输出:

1   5  14  30  55  91 140 204

对于ln(x1*x2*...xn)等其他功能,您通常仍可以有效地执行这些功能。如果不可能,您可以使用sapply,以下四个在输出中都是等效的:

log(cumprod(x))
sapply(cumprod(x), log)
sapply(cumprod(x), function(a) {log(a)})
sapply(1:8, function(i) {log(prod(x[1:i]))}) # not efficient.

然而,请注意,最后一个计算效率低,因为它会多次计算产品(先x1,然后x1*x2,然后x1*x2*x3,然后x1*x2*x3*x4等。),而其他人使用计算cumprod的{​​{1}},并将输出与x1*x2相乘,将该输出乘以x3,因此乘法的总数最小化。因此,请注意不要让事情过于复杂。

希望这有帮助!

答案 1 :(得分:2)

Hadley Wickham在Advanced R.中有一个非常好的reference

下面是一个代码示例

func <- function(x, myfun, ...) {
    cumsum(myfun(x, ...))
}

#examples
out <- func(1:8, `^`, e2=2)
identical(out, cumsum((1:8)^2))

identical(func(1:8, log), cumsum(log(1:8)))