如何用r :: apply()应用我自己的函数

时间:2015-10-30 13:27:02

标签: r function apply

我有以下数据框

   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)

我该怎么做?

2 个答案:

答案 0 :(得分:2)

以下是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) 的解决方案(灵感来自@kneijenhuijs)

apply()

你可以设置其他参数&#34; ...&#34;-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)

获得此解决方案
Vectorize(myfun, ...)

但是很难设置其他参数(Rmax =和precision =)。 另一个解决方案可以是FILLER。结果函数可以使用向量。

答案 1 :(得分:1)

您希望完成什么?让它在列之间运行并不合理,因为那时你从来没有炉排和gshape,但一次只有一个。

如果你想让它在各行之间运行(这样你就可以获得行中显示的格栅和gshape组合的答案),这段代码就可以了:

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