Data.table vs plyr регрессионный выход

Пакет 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];

Ответы

Ответ 1

Попробуйте следующее:

> 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(...)) не получилось так, как мы надеялись.