2013-09-16 77 views
0

我使用plyr包来按SUBJECT和YEAR运行面板数据的回归。我想仅使用R base函数复制plyr的输出。特别是,plyr包保留SUBJECT和YEAR变量名称,但base函数不包含。是否可以仅使用R base函数复制plyr输出?以下是我已经尝试了代码示例:R base vs plyr回归输出

data <- data.frame(SUBJECT=c(rep('FISHER',10), rep('HUNTER',10)), YEAR=c(rep(2011,5), rep(2012,5), rep(2011,5), rep(2012,5)), y=rnorm(20), x=rnorm(20)) 
data 

只使用[R base功能

with(data, t(sapply(split(data, list(SUBJECT,YEAR), drop=TRUE), function(x) { coef(lm(y ~ x, data = x)) }))) 

使用plyr功能

library(plyr) 
ddply(data, .(SUBJECT,YEAR), function(x) { coef(lm(y ~ x, data = x)) }) 

回答

1

试一下这个(ix <- 1:2也将工作):

ix <- c("SUBJECT", "YEAR") 
reg <- function(DF) cbind( DF[1, ix], t(coef(lm(y ~ x, DF))) ) 
do.call(rbind, by(data, data[ix], reg)) 

其中给出了这样的:

SUBJECT YEAR (Intercept)   x 
1 FISHER 2011 0.8665496 0.25377389 
2 HUNTER 2011 0.4954567 0.05370458 
3 FISHER 2012 0.5280182 0.95038956 
4 HUNTER 2012 -0.8319516 -0.04778639 
+0

没注意到你几乎相同的答复。我已经通过一些小改进对其进行了更新。 –

+0

@ G.Grothendieck,缺少结束括号对眼睛而言绝对容易:p – A5C1D2H2I1M1N2O1R2T1

1

我通常使用plyr对于这些类型的任务喽所以我猜测有一个更清晰的方式来做到这一点在基地R,但这里有一个解决方案:

> runRegression <- function(v){ 
+ sub <- data[data$SUBJECT == v[1] & data$YEAR == v[2],] 
+ coef(lm(y ~ x, data = sub)) 
+ } 
> 
> cbind(unique(data[,c("SUBJECT","YEAR")]),t(apply(unique(data[,c("SUBJECT","YEAR")]),1,runRegression))) 
    SUBJECT YEAR (Intercept)   x 
1 FISHER 2011 0.3409430 0.2860310 
6 FISHER 2012 0.1065906 0.5851614 
11 HUNTER 2011 -0.3774422 0.9029407 
16 HUNTER 2012 0.1697793 -0.5429523