R 在后续的元素对上应用函数
假设R 在后续的元素对上应用函数,r,vector,R,Vector,假设x是一个向量,myfunc是两个参数的函数。我希望得到myfunc在x的后续元素对上的结果向量。根据定义,该向量的长度应小于x的长度 例如,如果xlibrary(zoo) x在这种情况下,您可以diff()向量的log() x <- 1:4 diff(log(x)) 更新:I更通用的解决方案使用head()和tail()删除最后和第一个元素。您希望尽最大努力坚持矢量化解决方案,这应该更快、更节省内存 myFun <- function(x) log(tail(x, -1))
x
是一个向量,myfunc
是两个参数的函数。我希望得到myfunc
在x
的后续元素对上的结果向量。根据定义,该向量的长度应小于x
的长度
例如,如果xlibrary(zoo)
x在这种情况下,您可以diff()
向量的log()
x <- 1:4
diff(log(x))
更新:I更通用的解决方案使用head()
和tail()
删除最后和第一个元素。您希望尽最大努力坚持矢量化解决方案,这应该更快、更节省内存
myFun <- function(x) log(tail(x, -1)) - log(head(x, -1))
mappy(…)
将第一个参数中的函数“应用”到后续参数,在这种情况下,我们将x[1:3]
和x[2:4]
作为第二个参数,将第三个参数应用到mappy(…)
这也许是在回答我的示例,但这不是我的一般性问题。@Bach——我添加了一个更一般的解决方案。我最喜欢这个,因为它使用了基数R,它是一般性的,而且很容易理解。
library(zoo)
x <- 1:4
rollapply(x, width=2, FUN=function(x) return(log(x[2]/x[1])))
## [1] 0.6931472 0.4054651 0.2876821
x <- 1:4
diff(log(x))
> diff(log(x))
[1] 0.6931472 0.4054651 0.2876821
myFun <- function(x) log(tail(x, -1)) - log(head(x, -1))
> x <- seq(1e8)
> system.time(A <- diff(log(x)))
user system elapsed
8.42 1.28 9.90
> myFun <- function(x) log(tail(x, -1)) - log(head(x, -1))
> system.time(B <- myFun(x))
user system elapsed
9.29 1.40 10.78
> all.equal(A, B)
[1] TRUE
mapply(myfunc,x[-length(x)],x[-1])
# [1] 0.6931472 0.4054651 0.2876821