2012-06-29 14 views
15

Il pacchetto data.table è molto utile in termini di velocità. Ma sto avendo problemi in realtà usando l'output di una regressione lineare. C'è un modo semplice per ottenere che l'output data.table sia così bello/utile come quello dal pacchetto plyr? Di seguito è un esempio. Grazie!output regressione data.table vs 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]; 

Le stime dei coefficienti data.table vengono emessi in una singola colonna mentre le plyr/stime dei coefficienti ddply vengono emessi in più e ben etichettati colonne.

So che posso eseguire la regressione tre volte con data.table ma sembra davvero inefficiente. Potrei sbagliarmi però.

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

risposta

13

Prova questo:

> 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 

ho la fastidiosa sensazione che questa domanda è stato chiesto di meno di una settimana fa, ma non credo che sono arrivato in questo approccio quando ho provato e mi non ricordo che nessuna risposta era questa compatta.

Oh, eccolo .. su r-help. Matthew può commentare la legittimità di ciò, se vuole. Immagino che il messaggio sia che le funzioni che restituiscono liste non avranno dimensioni ridotte. La cosa interessante è stata l'utilizzo di list(coef(lm(...)) non riuscito nel modo in cui speravamo.

+1

C'era [questo] (http://stackoverflow.com/questions/11233183/grouping-in-data-table-how-to-get-more-than-1-column-of-results/11233262#11233262) da ieri (vedi, in particolare, il secondo commento alla mia risposta), ma è bello avere questa dimostrazione più prominente. –

+1

E si noti che 'list()' non è la risposta. –

+1

Ecco perché ho fatto riferimento al commento;) (Sto solo provando a mostrarti dove potresti avere quel sentimento fastidioso.) –