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
的长度

例如,如果
x
library(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