2013-08-26 12 views
5

Questo è probabilmente abbastanza semplice ma vorrebbe essere in grado di riepilogare alcuni dati (media e media) basati su una selezione casuale di colonne e di raggrupparli per una colonna diversa.Sintassi data.table per subsettaggio e riepilogo

prega di vedere sotto:

DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 
ww <- sample(c("y","v"),1) 
DT[,list(avg=mean(ww),med=median(ww)),by="x"] 
    x avg med 
1: a NA y 
2: b NA y 
3: c NA y 
Warning messages: 
1: In `[.data.table`(DT, , list(avg = mean(ww), med = median(ww)), : 
    argument is not numeric or logical: returning NA 
2: In `[.data.table`(DT, , list(avg = mean(ww), med = median(ww)), : 
    argument is not numeric or logical: returning NA 
3: In `[.data.table`(DT, , list(avg = mean(ww), med = median(ww)), : 
argument is not numeric or logical: returning NA 

Se per esempio ww successo a pari "v" allora mi aspetterei il seguente output

x avg med 
1: a 2 2 
2: b 5 5 
3: c 8 8 

Penso che sia proprio la sintassi che ho bisogno di regolare, ma sono incerto su come regolarlo ... Qualsiasi aiuto sarebbe molto apprezzato ...

+0

Ecco un altro modo per farlo: 'DT [, lapply (lista (avg = media, med = mediana), funzione (f) f (.SD [[ww]])), di =" x "]' o con 'get', come descritto nella risposta seguente ... – Frank

risposta

6

È necessario utilizzare get:

> DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 
> ww <- sample(c("y","v"),1) 
> DT[,list(avg=mean(get(ww)),med=median(get(ww))),by="x"] 
    x  avg med 
1: a 3.333333 3 
2: b 3.333333 3 
3: c 3.333333 3 
> ww 
[1] "y" 
+0

Ah! Sapevo che era semplice! –

+0

@ h.l.m, sarebbe meglio se 'data.table' fornisse in questo caso un messaggio di errore più descrittivo. – A5C1D2H2I1M1N2O1R2T1

+0

Ho sentito che è lento, ma '.SD [[ww]]' funziona anche: 'DT [, lista (avg = mean (.SD [[ww]]), med = median (.SD [[ww] ])), by = "x"] ' – Frank