Pilih beberapa kolom dalam data.tabel berdasarkan indeks numeriknya


143

Bagaimana kita dapat memilih beberapa kolom menggunakan vektor indeks numerik (posisi) mereka data.table?

Inilah yang akan kami lakukan dengan data.frame:

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

Jawaban:


185

Untuk versi data.tabel >= 1.9.8 , berikut ini semua berfungsi:

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

Untuk versi data.tabel < 1.9.8 (untuk pemilihan kolom numerik mana yang memerlukan penggunaan with = FALSE), lihat versi sebelumnya dari jawaban ini. Lihat juga BERITA pada v1.9.8, PERUBAHAN POTENSIAL BREAKING, poin 3.


1
Tidak masalah. Bandingkan juga dt[,"a"]dan dt[,"a", with=FALSE]untuk melihat apa opsi yang bermanfaat itu sebenarnya.
Josh O'Brien

3
ada cara untuk melakukan ini tanpa dengan? misalnya DT[,list(b:c), ketika saya merasa nyaman untuk mengubah kolom secara langsung di tabel data, misalnya saya bisa lakukan DT[,list(1/b,2*c)], tetapi ini tidak bekerja dengan.
jamborta

2
Perubahan pada paket akan membuat with=FALSEtidak perlu dalam kasus ini: github.com/Rdatatable/data.table/issues/…
Frank

1
@ Frank - Itu berita bagus! Terima kasih telah menyampaikannya pada saya. Setelah perubahan itu masuk ke versi data. Tabel didistribusikan pada CRAN, saya akan mengedit jawaban ini untuk mengumumkan perubahan di bagian atas. (Dan tolong - Anda atau siapa pun yang membaca ini - jangan segan-segan menelepon saya dengan pengingat segera setelah itu terjadi.)
Josh O'Brien

2
@Valentas Lucu, Anda harus bertanya. Tidak ada data.framecara yang kompatibel untuk digunakan with=FALSE. Namun, karena dari sekitar 3 minggu yang lalu, versi pengembangan data.table telah dimodifikasi untuk panggilan seperti dt[, 2], dt[, 2:3], dt[, "b"], dan dt[, c("b", "c")]berperilaku sama seperti yang mereka lakukan di dengan data.frames tanpa harus secara eksplisit mengatur with=FALSE. Luar biasa! Lihat di sini untuk komit tertentu, termasuk entri BERITA yang menggambarkan perubahan.
Josh O'Brien

43

Ini agak bertele-tele, tetapi saya sudah terbiasa menggunakan .SDvariabel tersembunyi .

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

Ini sedikit merepotkan, tetapi Anda tidak kehilangan fitur data.table lainnya (saya tidak berpikir), jadi Anda harus tetap dapat menggunakan fungsi penting lainnya seperti bergabung dengan tabel dll.


6
Tidak merepotkan dan sangat berguna saat membuat daftar kolom secara terprogram
Chris

39

Jika Anda ingin menggunakan nama kolom untuk memilih kolom, cukup gunakan .(), yang merupakan alias untuk 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

19

Dari v1.10.2 dan selanjutnya, Anda juga dapat menggunakan ..

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

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

dt[, ..keep_cols]

3
Terima kasih atas jawaban ini. Saya juga menemukan itu dt[, !..keep_cols]dan dt[, -..keep_cols] berfungsi seperti yang diharapkan!
IceCreamToucan

3

@ Tom, terima kasih banyak telah menunjukkan solusi ini. Ini sangat bagus untuk saya.

Saya mencari cara untuk mengecualikan satu kolom dari pencetakan dan dari contoh di atas. Untuk mengecualikan kolom kedua Anda dapat melakukan sesuatu seperti ini

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)]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.