2014-07-09 15 views
5

Non riesco a utilizzare data.table per riepilogare i risultati delle funzioni vettoriali, cosa semplice in ddply.Aggregazioni di tabelle dati con funzioni vettoriali, 2 2

Problema 1: aggregazione di una funzione di (costoso) con uscita vettore

dt <- data.table(x=1:20,y=rep(c("a","b"),each=10)) 

Questo comando ddply produce quello che voglio: comando tavolo

ddply(dt,~y,function(dtbit) quantile(dtbit$x)) 

Questi dati non fa quello che voglio:

dt[,quantile(x),by=list(y)] 

posso incidere in data.table in questo modo:

012.351.
dt[,list("0%"=quantile(x,0),"25%"=quantile(x,0.25), 
    "50%"=quantile(x,0.5)),by=list(y)] 

Ma questo verboso, e sarebbe anche lento se la funzione vettoriale "quantile" fosse lenta.

Un esempio simile è:

dt$z <- rep(sqrt(1:10),2) 

ddply(dt,~y,function(dtbit) coef(lm(z~x,dtbit))) 

Problema 2: Utilizzo di una funzione con input e output

xzsummary <- function(dtbit) t(summary(dtbit[,"x"]-dtbit[,"z"])) 

ddply(dt,~y,xzsummary) 

vettore Posso fare questo genere di cose facilmente in data.table?

Ci scusiamo se queste domande hanno già una risposta evidente.

Questo è un problema simile, non identica, a: data.table aggregations that return vectors, such as scale()

risposta

7
> dt[ , as.list(quantile(x)),by=y] 
    y 0% 25% 50% 75% 100% 
1: a 1 3.25 5.5 7.75 10 
2: b 11 13.25 15.5 17.75 20 

Ho provato ad utilizzare rbind, ma che non è riuscito a generare la disposizione di by-y pensavo che volevi. Il trucco con as.list (vs list) è che costruisce un elenco a più elementi con un vettore, mentre list mette il vettore in un solo elenco di elementi.

as.list agisce come sapply(x, list):

> dt[ , sapply(quantile(x), list), by=y] 
    y 0% 25% 50% 75% 100% 
1: a 1 3.25 5.5 7.75 10 
2: b 11 13.25 15.5 17.75 20 

la soluzione di destinazione:

> ddply(dt,~y,function(dtbit) quantile(dtbit$x)) 
    y 0% 25% 50% 75% 100% 
1 a 1 3.25 5.5 7.75 10 
2 b 11 13.25 15.5 17.75 20 

ero un po 'orgoglioso di questa soluzione, ma memore di fortunes::fortune("Liaw-Baron principle") .......... ..

Infine, da quello che potremmo chiamare il "principio di Liaw-Barone", ogni domanda che può essere chiesto ha infatti già stato chiesto. - Dirk Eddelbuettel (citando Andy Liaw e l'opinione di Jonathan Baron su questioni unici su R-aiuto) R-aiuto (gennaio 2006)

....Ho fatto una ricerca su: [r] data.table as.list, e scoprire che io sono in alcun modo il primo a postare questa strategia su SO:

Tabulate a data frame in R

Using ave() with function which returns a vector

create a formula in a data.table environment in R

io non so davvero se questa domanda sarebbe considerata un duplicato, ma sono particolarmente grato a @ G.Grothedieck per l'ultimo. Potrebbe essere dove ho preso la strategia. Ci sono stati circa 125 colpi per quella ricerca e ho passato solo i primi 20 a raccogliere quegli esempi, quindi potrebbero esserci altre perle che non ho scoperto.

+0

Che bella e semplice soluzione (per il rilascio 1) !! – ewallace

Problemi correlati