2013-02-23 11 views
7

Se gruppo: utilizzando la parola chiave by in data.table, restituisce sempre la colonna by come prima colonna. C'è una bandiera/opzione per dirgli di non farlo? O un modo intelligente per liberarsene?Esiste un modo per non restituire la colonna `by` come prima colonna in un raggruppamento data.table

In particolare voglio gruppo e poi rbindlist al mio tavolo originale, in modo infatti il ​​problema potrebbe anche dire come - "come fermarlo riordinare le colonne"

Per esempio:

DT = data.table(I = as.numeric(1:6), N = rnorm(6), L = rep(c("a", "b", "c"), 2)) 
DT[, list(I = mean(I), N = mean(N)), by= L] 
DT 

dà:

> DT[, list(I = mean(I), N = mean(N)), by= L] 
    L I   N 
1: a 2.5 0.4291802 
2: b 3.5 0.6669517 
3: c 4.5 -0.6471886 
> DT 
    I   N L 
1: 1 1.8460998 a 
2: 2 0.7093438 b 
3: 3 -1.7991193 c 
4: 4 -0.9877394 a 
5: 5 0.6245596 b 
6: 6 0.5047421 c 

per quanto riguarda la richiesta di rbindlist va, sarebbe bello essere in grado di fare questo:

DT = rbindlist(list(DT, DT[, list(I = mean(I), N = mean(N)), by= L])) 

o forse

DT = rbindlist(list(DT, DT[, list(I = mean(I), N = mean(N), L), by= L])) 

o qualcosa di simile (nessuno dei quali lavoro)

+2

(+1) Mi piacerebbe molto che le colonne vengano restituite nello stesso ordine! – Arun

+3

Carone, @Arun, ok +1 ora aggiunto a [FR # 1757] (https://r-forge.r-project.org/tracker/?group_id=240&atid=978&func=detail&aid=1757). –

+1

@MatthewDowle, grazie per aver aggiunto questa funzionalità all'elenco delle cose da fare. – Arun

risposta

4

non mi piace particolarmente questo auto-colonna-riordino pure. Il "trucco" faccio di solito è quello di utilizzare setcolorder dopo aver ottenuto l'output come segue:

DT <- data.table(I = 1:6, N = rnorm(6), L = rep(c("a", "b", "c"), 2)) 
DT.out <- DT[, list(I = mean(I), N = mean(N)), by= L] 

Qui, setcolorder come:

setcolorder(DT.out, names(DT)) 

#  I   N L 
# 1: 2.5 0.772719306 a 
# 2: 3.5 -0.008921738 b 
# 3: 4.5 -0.770807996 c 

Naturalmente questo funziona se i nomi dei DT sono gli stessi DT.out. Altrimenti, si dovrà specificare l'ordine delle colonne in modo esplicito come:

setcolorder(DT.out, c("I", "N", "L")) 

Edit: Dal momento che si desidera associare immediatamente li per righe, sì, sarebbe bello non avere questo come intermedio risultato. E poiché rbindlist sembra vincolare per posizione, è possibile utilizzare rbind che si lega per nome colonna e data.table indica questo come un avviso e suggerisce di utilizzare use.names=F se si desidera invece eseguire il binding in base alla posizione. Puoi tranquillamente ignorare questo avviso.

dt1 <- data.table(x=1:5, y=6:10) 
dt2 <- data.table(y=1:5, x=6:10) 

rbind(dt1, dt2) # or do.call(rbind, list(dt1, dt2)) 

#  x y 
# 1: 1 6 
# 2: 2 7 
# 3: 3 8 
# 4: 4 9 
# 5: 5 10 
# 6: 6 1 
# 7: 7 2 
# 8: 8 3 
# 9: 9 4 
# 10: 10 5 
# Warning message: 
# In .rbind.data.table(...) : 
# Argument 2 has names in a different order. Columns will be bound by name for 
# consistency with base. Alternatively, you can drop names (by using an unnamed 
# list) and the columns will then be joined by position. Or, set use.names=FALSE. 
+0

+1 ma sì, ci avevo pensato, ma voglio fare immediatamente rbind list e quindi sarebbe bello non dover memorizzare l'intermedio solo per riordinare le colonne (aggiungerò questo alla domanda per renderlo più chiaro. – Corone

+0

Penso che 'rbind' si occupi automaticamente del riordino delle colonne? – Arun

+0

sembra come' rbindlist' cancella i nomi delle colonne per associare per posizione, che è diverso da 'rbind' su' data.frames' che, se esistono nomi di colonne identici in ordine diverso , si fonde in modo appropriato – Arun

Problemi correlati