2016-01-22 4 views
7

Ho il seguente data.tablefusibile fusione/dcast in un solo passo

library(data.table) 
testdt <- data.table(var1=rep(c("a", "b"), e=3), p1=1:6, p2=11:16) 
# var1 p1 p2 
#1: a 1 11 
#2: a 2 12 
#3: a 3 13 
#4: b 4 14 
#5: b 5 15 
#6: b 6 16 

devo avere il valore mediano di ogni var1 per ogni p*, il p* dovrebbe essere in righe e differenti valori unici di var1 in colonne.
Così, sto cercando questa uscita:

variable a b 
1  p1 2 5 
2  p2 12 15 

Il modo più semplice che ho trovato per farlo è:

dcast(melt(testdt, id.vars = "var1", measure.vars = c("p1", "p2")), 
     variable ~ var1, 
     value.var = "value", 
     fun.aggregate = median) 

Ma ho la sensazione che mi manca qualcosa qui (come il funzione più adatta) quindi mi piacerebbe sapere un modo diretto (funzione unica) per fare lo stesso.

Sono consapevole recast del pacchetto reshape2 potrebbe fare il trucco con recast(testdt, variable~var1, fun=median, id.var="var1"), ma mi piacerebbe evitare di caricare un altro pacchetto.

Edit:

Sto cercando una soluzione semplice e efficiente. Questo sarebbe applicato in un elenco di ~ 40 tabelle con ~ 300 colonne e ~ 80 righe

+2

Prova 'testdt [, lapply (.SD, mediana), var1]' ma questa è la trasposizione di quello che volevi. – akrun

+1

grazie a @akrun, già provato ma ho bisogno della parte "transpose" – Cath

+0

Presumo che questo sia * non * correlato alle prestazioni. È corretto? – A5C1D2H2I1M1N2O1R2T1

risposta

1

Se la velocità è un problema primario, c'è un leggero aumento della velocità di circa il 23% (anche se in millisecondi) se si calcola il median prima. È probabile inoltre che questo delta aumenti con l'aumentare delle dimensioni del set di dati, in quanto vi sono meno dati da fondere.

library(data.table) 
dcast(melt(testdt[, lapply(.SD, median), by=var1], id.vars="var1"), variable ~ var1)) 

riferimento

Unit: milliseconds 

expr       min  lq mean median  uq  max neval 
fun.aggregate = median 4.221654 4.453063 4.87418 4.510775 4.579718 35.28569 1000 
lapply(.SD, median)  3.196289 3.410711 3.77483 3.461073 3.523096 22.78637 1000 
+0

Grazie per la tua risposta lo studierò meglio più tardi non sono con un pc adesso – Cath