2013-02-23 7 views
7

Jeśli grupuję - używając słowa kluczowego by w data.table, zawsze zwraca ona kolumnę by jako pierwszą kolumnę. Czy jest flaga/opcja, aby powiedzieć, żeby tego nie robić? Lub sprytny sposób na pozbycie się tego?Czy istnieje sposób, aby nie zwracać kolumny 'by` jako pierwszej kolumny w tabeli data.table

W szczególności chcę grupy, a następnie rbindlist do mojej oryginalnej tabeli, więc to rzeczywiście problem może również powiedzieć, jak - „jak go zatrzymać zmiany kolejności kolumn”

na przykład:

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 

daje:

> 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 

ile wniosek rbindlist idzie, byłoby miło, aby móc to zrobić:

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

czy może

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

lub coś podobnego (z których żadna praca)

+2

(+1) Mogę * naprawdę * polubić dla kolumn, które zostaną zwrócone w tej samej kolejności, jak również! – Arun

+3

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

+1

@MatthewDowle, dzięki za dodanie tej funkcji do listy zadań. – Arun

Odpowiedz

4

Nie szczególnie jak zmiana kolejności auto-column-to za dobrze. W „trick” zwykle zrobić jest użycie setcolorder po uzyskaniu wyjście następująco:

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] 

Tutaj setcolorder jak:

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 

Oczywiście to działa, jeśli nazwy DT są takie same jak DT.out. Indziej, musisz określić kolejność kolumn jawnie jako:

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

Edit: Ponieważ chcesz związać je natychmiast rzędach, tak, to byłoby miło, aby nie mieć tego jako półprodukt wynik. A ponieważ rbindlist wydaje się wiązać z pozycji, można użyć rbind, która wiąże się z nazwami kolumn i data.table mówi to jako ostrzeżenie i sugeruje, aby użyć use.names=F, jeśli chcesz zamiast tego powiązać według pozycji. Możesz bezpiecznie zignorować to ostrzeżenie.

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, ale tak, pomyślałem o tym, ale chcę natychmiast sporządzić listę rbind, więc byłoby mi miło nie przechowywać pośrednika tylko po to, aby zmienić kolejność kolumn (dodam to do pytania, aby było bardziej zrozumiałe. – Corone

+0

Myślę, że 'rbind' zajmuje się automatyczną zmianę kolejności kolumn? – Arun

+0

wydaje się, że' rbindlist' upuszcza nazwy kolumn, aby powiązać je z pozycją, która różni się od 'rbind' na' data.frames', która, jeśli identyczne nazwy kolumn istnieją w innej kolejności , odpowiednio się łączy – Arun

Powiązane problemy