15

data.table 包在速度方面非常有帮助。但我在实际使用线性回归的输出时遇到了麻烦。有没有一种简单的方法可以让 data.table 输出与 plyr 包中的输出一样漂亮/有用?下面是一个例子。谢谢!

library('data.table');
library('plyr');

REG <- data.table(ID=c(rep('Frank',5),rep('Tony',5),rep('Ed',5)), y=rnorm(15), x=rnorm(15), z=rnorm(15));
REG;

ddply(REG, .(ID), function(x) coef(lm(y ~ x + z, data=x)));

REG[, coef(lm(y ~ x + z)), by=ID];

data.table 系数估计值在单个列中输出,而 plyr/ddply 系数估计值在多个且标记良好的列中输出。

我知道我可以使用 data.table 运行回归三次,但这似乎效率很低。不过,我可能是错的。

REG[, Intercept=coef(lm(y ~ x + z))[1],
      x        =coef(lm(y ~ x + z))[2],
      z        =coef(lm(y ~ x + z))[3], by=ID];
4

1 回答 1

14

试试这个:

> REG[, as.list(coef(lm(y ~ x + z))), by=ID];
        ID (Intercept)           x         z
[1,] Frank  -0.2928611  0.07215896  1.835106
[2,]  Tony   0.9120795 -1.11153056  2.041260
[3,]    Ed   1.0498359  5.77131778 -1.253741

我有一种挥之不去的感觉,这个问题是在不到一周前被问到的,但我认为我在尝试时没有想到这种方法,而且我不记得有任何答案是这样紧凑的。

哦,在 r-help 上有.. 如果他愿意,马修可以评论这件事的正当性。我想信息是返回列表的函数不会删除维度。有趣的是使用list(coef(lm(...))并没有按照我们希望的方式成功。

于 2012-06-29T18:33:21.147 回答