Wybierz wiele kolumn w data.table według ich indeksów liczbowych

143

Jak możemy wybrać wiele kolumn za pomocą wektora ich indeksów numerycznych (pozycji) w data.table?

Oto jak zrobilibyśmy z data.frame:

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3
jamborta
źródło

Odpowiedzi:

185

W przypadku wersji data.table >= 1.9.8 działają tylko następujące elementy:

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

Wersje data.table < 1.9.8 (dla których wybór kolumny numerycznej wymagał użycia with = FALSE) można znaleźć w poprzedniej wersji tej odpowiedzi. Zobacz także WIADOMOŚCI w wersji 1.9.8, POTENCJALNIE WYJĄTKOWE ZMIANY, punkt 3.

Josh O'Brien
źródło
1
Nie ma problemu. Porównaj także dt[,"a"]i dt[,"a", with=FALSE]zobacz, jaka to naprawdę pomocna opcja.
Josh O'Brien
3
jakikolwiek sposób to zrobić bez z? na przykład DT[,list(b:c), ponieważ uznałem za wygodne przekształcanie kolumn bezpośrednio w tabeli danych, np. mogę to zrobić DT[,list(1/b,2*c)], ale to nie działa z.
jamborta
2
Zmiana w pakiecie sprawi, że with=FALSEw tym przypadku będzie niepotrzebna: github.com/Rdatatable/data.table/issues/ ...
Frank
1
@Frank - to wspaniała wiadomość! Dziękuję za zwrócenie mi na to uwagi. Gdy ta zmiana dotrze do wersji data.table rozpowszechnianej w CRAN, edytuję tę odpowiedź, aby ogłosić zmianę u góry. (I proszę - ty lub ktokolwiek inny, kto to czyta - możesz wysłać mi przypomnienie, gdy tylko to się stanie.)
Josh O'Brien
2
@Valentas Śmieszne, powinieneś zapytać. Nie ma data.framekompatybilnego sposobu użycia with=FALSE. Jednak od około 3 tygodni temu, wersja rozwojowa data.table został zmodyfikowany do połączeń, takich jak dt[, 2], dt[, 2:3], dt[, "b"], i dt[, c("b", "c")]zachowują się tak samo jak robią to w ze data.frames bez konieczności jawnie ustawione with=FALSE. To straszne! Zobacz tutaj dla konkretnego zatwierdzenia, w tym wpis NEWS opisujący zmianę.
Josh O'Brien
43

To trochę rozwlekłe, ale przyzwyczaiłem się do używania ukrytej .SDzmiennej.

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

To trochę kłopotliwe, ale nie tracisz innych funkcji data.table (nie sądzę), więc nadal powinieneś być w stanie korzystać z innych ważnych funkcji, takich jak łączenie tabel itp.

Tomek
źródło
6
Nie jest to kłopotliwe i bardzo przydatne podczas programowego tworzenia listy kolumn
Chris
39

Jeśli chcesz użyć nazw kolumn do wybrania kolumn, po prostu użyj .(), co jest aliasem dla 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
źródło
19

Od wersji 1.10.2 możesz również używać ..

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

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

dt[, ..keep_cols]
rafa.pereira
źródło
3
Dzięki za tę odpowiedź. Znalazłem to dt[, !..keep_cols]i dt[, -..keep_cols] działa zgodnie z oczekiwaniami!
IceCreamToucan
3

@Tom, bardzo dziękuję za wskazanie tego rozwiązania. Działa świetnie dla mnie.

Szukałem sposobu, aby po prostu wykluczyć jedną kolumnę z drukowania iz powyższego przykładu. Aby wykluczyć drugą kolumnę, możesz zrobić coś takiego

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
źródło