Wählen Sie mehrere Spalten in data.table anhand ihrer numerischen Indizes aus

143

Wie können wir mehrere Spalten unter Verwendung eines Vektors ihrer numerischen Indizes (Position) in auswählen data.table?

So würden wir es machen mit data.frame:

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3
Jamborta
quelle

Antworten:

185

Für Versionen von data.table funktionieren >= 1.9.8 die folgenden Funktionen:

library(data.table)
dt <- data.table(a = 1, b = 2, c = 3)

# select single column by index
dt[, 2]
#    b
# 1: 2

# select multiple columns by index
dt[, 2:3]
#    b c
# 1: 2 3

# select single column by name
dt[, "a"]
#    a
# 1: 1

# select multiple columns by name
dt[, c("a", "b")]
#    a b
# 1: 1 2

Informationen zu Versionen von data.table< 1.9.8 (für die die Auswahl numerischer Spalten erforderlich war with = FALSE) finden Sie in dieser vorherigen Version dieser Antwort. Siehe auch NEWS in Version 1.9.8, POTENZIELL BREAKING CHANGES, Punkt 3.

Josh O'Brien
quelle
1
Kein Problem. Vergleichen Sie auch dt[,"a"]und dt[,"a", with=FALSE]sehen Sie, was für eine hilfreiche Option es wirklich ist.
Josh O'Brien
3
Wie geht das ohne? Zum Beispiel DT[,list(b:c), da ich es bequem fand, die Spalten direkt in der Datentabelle zu transformieren, zB kann ich das DT[,list(1/b,2*c)], aber das funktioniert nicht mit.
Jamborta
2
Eine Änderung des Pakets macht with=FALSEin diesem Fall unnötig: github.com/Rdatatable/data.table/issues/…
Frank
1
@Frank - Das sind großartige Neuigkeiten! Vielen Dank, dass Sie mich darauf aufmerksam gemacht haben. Sobald diese Änderung in die auf CRAN verteilte Version von data.table eingegangen ist , werde ich diese Antwort bearbeiten, um die Änderung oben anzukündigen. (Und bitte - Sie oder jemand anderes, der dies liest - zögern Sie nicht, mich mit einer Erinnerung anzurufen, sobald dies geschieht.)
Josh O'Brien
2
@ Valentas Lustig solltest du fragen. Es gibt keine data.framekompatible Verwendung with=FALSE. Wie jedoch von ca. 3 Wochen, die Entwicklungsversion von data.table wurde , um Anrufe wie geändert dt[, 2], dt[, 2:3], dt[, "b"], und dt[, c("b", "c")]verhalten sich genauso , wie sie in der mit tun data.frames ohne explizit festgelegt zu haben with=FALSE. Es ist großartig! Hier finden Sie das jeweilige Commit, einschließlich des NEWS-Eintrags, der die Änderung beschreibt.
Josh O'Brien
43

Es ist ein bisschen ausführlich, aber ich habe mich daran gewöhnt, die versteckte .SDVariable zu verwenden.

b<-data.table(a=1,b=2,c=3,d=4)
b[,.SD,.SDcols=c(1:2)]

Es ist ein bisschen mühsam, aber Sie verlieren nicht an anderen Funktionen von data.table (glaube ich nicht), sodass Sie weiterhin andere wichtige Funktionen wie Join-Tabellen usw. verwenden können sollten.

Tom
quelle
6
Kein Aufwand und sehr nützlich beim programmgesteuerten Erstellen der Spaltenliste
Chris
39

Wenn Sie Spalte verwenden möchten Namen die Spalten auszuwählen, verwenden Sie einfach .(), das ist ein Alias für list():

library(data.table)
dt <- data.table(a = 1:2, b = 2:3, c = 3:4)
dt[ , .(b, c)] # select the columns b and c
# Result:
#    b c
# 1: 2 3
# 2: 3 4
R Yoda
quelle
19

Ab Version 1.10.2 können Sie auch verwenden ..

dt <- data.table(a=1:2, b=2:3, c=3:4)

keep_cols = c("a", "c")

dt[, ..keep_cols]
rafa.pereira
quelle
3
Danke für diese Antwort. Ich habe das auch gefunden dt[, !..keep_cols]und dt[, -..keep_cols] funktioniert wie erwartet!
IceCreamToucan
3

@ Tom, vielen Dank, dass Sie auf diese Lösung hingewiesen haben. Es funktioniert großartig für mich.

Ich suchte nach einer Möglichkeit, nur eine Spalte vom Druck und vom obigen Beispiel auszuschließen. Um die zweite Spalte auszuschließen, können Sie so etwas tun

library(data.table)
dt <- data.table(a=1:2, b=2:3, c=3:4)
dt[,.SD,.SDcols=-2]
dt[,.SD,.SDcols=c(1,3)]
Bhoom Suktitipat
quelle