【发布时间】:2015-07-25 13:35:14
【问题描述】:
我想在data.frame 中跨因子的交叉级别应用一个函数,类似于aggregate 会做的事情,但是对于比aggregate 可以处理的更复杂的函数。
例如。
fact1=c(rep('A',6),rep('B',6))
fact2=c(rep(c(rep('C',3),rep('D',3)),2))
crit1=rnorm(12)
crit2=crit1+rnorm(12)
dat=data.frame(fact1,fact2,crit1,crit2)
target.fit = function(dat){
mod=lm(dat$crit2~dat$crit1)
return(mod$coefficients[2])
}
此代码生成data.frame dat。目标是将target.fit 应用于fact1 和fact2 的每个交叉级别(这里是lm)。
对于只需要一个输入向量(例如使用aggregate 的平均值)的函数,执行此操作很简单。
> aggregate(dat,list(fact1=fact1,fact2=fact2),mean)
fact1 fact2 fact1 fact2 crit1 crit2
1 A C NA NA -0.5875951 -0.6048572
2 B C NA NA 0.3712372 0.9135742
3 A D NA NA -1.0163750 -2.4971846
4 B D NA NA 0.3937682 0.6227697
但是,aggregate 不适用于多变量输入。
> aggregate(dat,list(fact1=fact1,fact2=fact2),target.fit)
Error in dat$crit2 : $ operator is invalid for atomic vectors
如何解决这个编程问题?
【问题讨论】: