我有以下数据框
GRATE GSHAPE
1 0.04 1.0
2 0.08 0.5
3 0.12 2.0
我想通过跟随函数
来计算新列COLmyfun = 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)
我该怎么做?
答案 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])})