data.table vs plyr回归输出

use*_*868 15 r data.table

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];
Run Code Online (Sandbox Code Playgroud)

data.table系数估计值在单列中输出,而ply​​r/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];
Run Code Online (Sandbox Code Playgroud)

42-*_*42- 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
Run Code Online (Sandbox Code Playgroud)

我有一种唠叨的感觉,这个问题是在不到一个星期前被问到的,但是当我尝试这个问题时,我认为我没有达到这种方法,我不记得任何答案都是这个问题.

哦,它在r-help上.马修可以根据自己的意愿评论这种合法性.我想消息是返回列表的函数不会丢弃维度.有趣的是,使用list(coef(lm(...))没有按照我们希望的方式成功.

  • 只是为了澄清,`list()`的问题是它返回一个*one-element list*,它包含一个长度为三的向量,而不是一个*三元素列表*,每个元素都是一个长度为一的向量(如果我们希望data.table将结果放在三个不同的列中,那就是我们需要的). (2认同)