【问题标题】:Applying function to multiple rows using values from multiple rows使用来自多行的值将函数应用于多行
【发布时间】:2013-03-22 01:59:50
【问题描述】:

我在 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 它应该使用下一行中的一些值,或者我是否应该寻找与 @ 不同的方法987654330@?

非常感谢!

【问题讨论】:

  • 最后一行呢? a=75, b=58, c=10 和 d 和 e 是?
  • 好点!假设d=X2+2 (so 60)e=0。 (对于我的项目,最后一行实际上并不感兴趣)

标签: r apply


【解决方案1】:

使用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

【讨论】:

  • 抱歉,shift(dat$x2)(假设它与 OP 的数据中的 x2 相同)与您显示的一样吗?
  • 感谢@Ari 成功了!为了解决最后一行的问题,我将代码更改如下:dat$x4 &lt;- mapply(dat$x1, dat$x2, dat$x3, c(shift(dat$x2,wrap=F),dat$x2[length(dat$x2)]+2), c(shift(dat$x3,wrap=F),0), FUN=fun)
  • @Arun 我没有意识到 OP 在他的 data.frame 构造中使用了随机值,而没有指定 set.seed(),这可能就是为什么乍一看它看起来与 OP 相同的原因。添加了我的dat 的样子。
  • embed 函数可能是在传递给 mapply 之前移动行的另一种选择。
猜你喜欢
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
相关资源
最近更新 更多