0

我在 R 中创建了以下简单函数:

fun    <- function(a,b,c,d,e){b+(c-a)*((e-b)/(d-a))}

我想将此函数应用于data.frame看起来像:

> data.frame("x1"=seq(55,75,5),"x2"=round(rnorm(5,50,10),0),"x3"=seq(30,10,-5))
  x1 x2 x3
1 55 51 30
2 60 45 25
3 65 43 20
4 70 57 15
5 75 58 10

我想应用fun到每个单独的行以创建一个新变量x4,但现在困难的部分(至少对我来说......):对于参数 d 和 e 我想使用下一行的x2x3。因此,对于示例的第一行,这意味着:fun(a=55,b=51,c=30,d=45,e=25). 我知道我可以用来mapply()对每一行应用一个函数,但我不知道如何告诉 mapply 它应该使用下一行的一些值,或者我是否应该寻找一种不同的方法mapply()

提前谢谢了!

4

1 回答 1

6

使用mapply,但将第四列和第五列移动一行。您可以手动完成,也可以使用taRifx::shift.

> dat
  x1 x2 x3
1 55 25 30
2 60 58 25
3 65 59 20
4 70 68 15
5 75 43 10
library(taRifx)
> shift(dat$x2)
[1] 58 59 68 43 25
> mapply( dat$x1, dat$x2, dat$x3, shift(dat$x2), shift(dat$x3) , FUN=fun )
[1]    25.00000 -1272.00000   719.00000   -50.14815    26.10000

如果您希望最后一行是 NA 而不是换行,请使用wrap=FALSE,pad=TRUE

> shift(dat$x2,wrap=FALSE,pad=TRUE)
[1] 58 59 68 43 NA
于 2013-03-21T16:11:32.557 回答