使用多行中的值将函数应用于多行

时间:2013-03-21 16:01:41

标签: r apply

我在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()

非常感谢提前!

1 个答案:

答案 0 :(得分: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