2012-06-29 18 views
15

El paquete data.table es muy útil en términos de velocidad. Pero estoy teniendo problemas para usar el resultado de una regresión lineal. ¿Hay alguna manera fácil de conseguir que la salida data.table sea tan bonita/útil como la del paquete plyr? A continuación hay un ejemplo. ¡Gracias!data.table vs plyr regression output

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]; 

Las estimaciones de los coeficientes data.table se emiten en una sola columna, mientras que las estimaciones de los coeficientes plyr/ddply se emiten en múltiples y bien marcadas columnas.

Sé que puedo ejecutar la regresión tres veces con data.table pero eso parece realmente ineficiente. Sin embargo, podría estar equivocado.

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

Respuesta

13

Prueba esto:

> 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 

que tienen la sensación de que esta pregunta se hizo hace menos de una semana, pero no creo que llegué a este enfoque cuando lo probé y me No recuerdo que ninguna respuesta fue este compacto.

Oh, ahí está .. en r-help. Matthew puede comentar sobre lo correcto de esto si lo desea. Supongo que el mensaje es que las funciones que devuelven listas no tendrán dimensiones caídas. Lo interesante fue que el uso de list(coef(lm(...)) no tuvo éxito de la manera que esperábamos.

+1

Hubo [esto] (http://stackoverflow.com/questions/11233183/grouping-in-data-table-how-to-get-more-than-1-column-of-results/11233262#11233262) desde ayer (ver especialmente el segundo comentario de mi respuesta), pero es bueno tener este demo más prominente. –

+1

Y observe que 'list()' no es la respuesta. –

+1

Es por eso que hice referencia al comentario;) (Estoy tratando de mostrarle dónde podría haber sentido esa sensación molesta) –