Wybierz wiele kolumn w danych.tabela według ich indeksów liczbowych

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

Tak zrobilibyśmy z data.frame:

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3
 147
Author: Henrik, 2012-11-14

5 answers

Dla wersji danych.Tabela >= 1.9.8, następujące wszystko po prostu działa:

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

Dla wersji danych.Tabela < 1.9.8 (dla których wybór kolumny numerycznej wymagał użycia with = FALSE), patrz poprzednia wersja niniejszej odpowiedzi. Zobacz także NEWS on v1. 9. 8, potencjalnie przełomowe zmiany, pkt 3.

 187
Author: Josh O'Brien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-29 09:09:08

To trochę gadatliwe, ale przyzwyczaiłem się do używania ukrytej zmiennej .SD.

b<-data.table(a=1,b=2,c=3,d=4)
b[,.SD,.SDcols=c(1:2)]
To trochę kłopotliwe, ale nie tracisz na innych danych.table features (I don ' t think), więc nadal powinny być w stanie korzystać z innych ważnych funkcji, takich jak join tables itp.
 43
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-05 16:00:09

Jeśli chcesz użyć nazw kolumn , aby wybrać kolumny, po prostu użyj .(), który 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
 39
Author: R Yoda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-04 16:50:03

Począwszy od wersji 1.10.2, możesz również użyć ..

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

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

dt[, ..keep_cols]
 20
Author: rafa.pereira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-02 06:48:13

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

Szukałem sposobu, aby wykluczyć jedną kolumnę z druku i z 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)]
 3
Author: Bhoom Suktitipat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-04 08:46:04