【问题标题】:How to apply my own function with r::apply()如何使用 r::apply() 应用我自己的函数
【发布时间】:2015-10-30 13:27:01
【问题描述】:

我有以下数据框

   GRATE GSHAPE
1  0.04    1.0
2  0.08    0.5
3  0.12    2.0

我想通过以下函数计算一个新列 COL

myfun = function (Rmax=150, precision=0.1, grate, gshape){
  s = seq(0,Rmax,precision)
  R = pgamma(s, rate=grate, shape=gshape)
  Rc = 1-R
  Rc2 = Rc^2
  Rc2ds = Rc2*precision
  intRc2ds = sum(Rc2ds, na.rm=TRUE)
  return(intRc2ds)
}

这不能正常工作:

mydf$COL = apply(mydf, 2, myfun, grate=mydf$GRATE, gshape=mydf$GSHAPE)

我应该怎么做?

【问题讨论】:

  • 我没有看到你的函数做了什么,但你实际上是在使用向量。然后您需要使用 1 作为边距而不是 2 的 apply,并且在调用 apply 中将一行作为“向量”,将此向量的第一个和第二个参数用作 grate 和 gshape

标签: r function apply


【解决方案1】:

你到底想完成什么?让它跨列运行是没有意义的,因为那样你就不会同时拥有一个 grate 和 gshape,而一次只有一个。

如果您想让它跨行运行(以便您得到行中显示的 grate 和 gshape 组合的答案),此代码有效:

mydf$COL = apply(mydf, 1, function(x) {myfun(grate=x[1], gshape=x[2])})

【讨论】:

  • 啊,我明白了,我错过了索引。我的错!
  • 我想计算每一行的伽马累积分布平方的积分,前两列给出了速率和形状。我猜@kneijenhuijs 的这个答案是正确的,我正在测试它。谢谢!
  • 其实不太简单,我的意思是一个函数中的一个函数,……我自己永远也找不到。谢谢!
  • 该函数应该实现这一点。这不是一个简单的解决方案,里面的函数完成了向量的索引(因为 apply 不能很好地处理向量)。 @jogo 的解决方案实际上将索引放在 myfun 函数中。
【解决方案2】:

这是apply() 的解决方案(受@kneijenhuijs 启发)

myfun = function (grate.gshape, Rmax=150, precision=0.1) {
  grate <- grate.gshape[1]; gshape <- grate.gshape[2]
  s = seq(0, Rmax, precision)
  Rc2ds = (1-pgamma(s, rate=grate, shape=gshape))^2 *precision
  sum(Rc2ds, na.rm=TRUE) # intRc2ds
}
apply(mydf, 1, myfun)

您可以根据apply()的“...”参数设置其他参数

首先我通过mapply() 得到了这个解决方案:

mydf <- read.table(header=TRUE, text='GRATE GSHAPE
1  0.04    1.0
2  0.08    0.5
3  0.12    2.0')

myfun = function (grate, gshape, Rmax=150, precision=0.1){
  s = seq(0,Rmax,precision)
  R = pgamma(s, rate=grate, shape=gshape)
  Rc = 1-R
  Rc2 = Rc^2
  Rc2ds = Rc2*precision
  intRc2ds = sum(Rc2ds, na.rm=TRUE)
  return(intRc2ds)
}

mapply(myfun, mydf$GRATE, mydf$GSHAPE)

但是很难设置其他参数(Rmax= 和precision=)。 另一种解决方案是Vectorize(myfun, ...)。生成的函数可以与向量一起使用。

【讨论】:

    猜你喜欢
    • 2018-03-17
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多