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