Chọn nhiều cột trong data.table bằng các chỉ số số của chúng


143

Làm thế nào chúng ta có thể chọn nhiều cột bằng cách sử dụng một vectơ chỉ số (vị trí) của chúng trong data.table?

Đây là cách chúng tôi sẽ làm với data.frame:

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

Câu trả lời:


185

Đối với các phiên bản của data.table >= 1.9.8 , tất cả những thứ sau đây chỉ hoạt động:

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

Đối với các phiên bản data.table < 1.9.8 (trong đó lựa chọn cột số yêu cầu sử dụng with = FALSE), hãy xem phiên bản trước của câu trả lời này. Xem thêm TIN TỨC trên v1.9.8, TIỀM NĂNG THAY ĐỔI, điểm 3.


1
Không vấn đề gì. So sánh cũng dt[,"a"]dt[,"a", with=FALSE]để xem nó thực sự là một lựa chọn hữu ích.
Josh O'Brien

3
bất cứ cách nào để làm điều này mà không có? ví dụ DT[,list(b:c), như tôi thấy thuận tiện khi chuyển đổi các cột trực tiếp trong bảng dữ liệu, ví dụ tôi có thể làm DT[,list(1/b,2*c)], nhưng điều này không hoạt động với.
jamborta

2
Thay đổi gói sẽ with=FALSEkhông cần thiết trong trường hợp này: github.com/Rdatitable/data.table/issues/ Kẻ
Frank

1
@Frank - Đó là tin tuyệt vời! Cám ơn bạn đã khiến tôi chú ý tới việc này. Khi thay đổi đó được đưa vào phiên bản data.table được phân phối trên CRAN, tôi sẽ chỉnh sửa câu trả lời này để thông báo thay đổi lên trên cùng. (Và xin vui lòng - bạn hoặc bất kỳ ai khác đọc điều này - vui lòng ping tôi với lời nhắc ngay khi điều đó xảy ra.)
Josh O'Brien

2
@Valentas Hài hước bạn nên hỏi. Không có data.framecách nào tương thích để sử dụng with=FALSE. Tuy nhiên, tính đến khoảng 3 tuần trước, phiên bản phát triển của data.table đã được sửa đổi để cuộc gọi như dt[, 2], dt[, 2:3], dt[, "b"], và dt[, c("b", "c")]cư xử giống như họ làm trong với data.frames mà không cần phải thiết lập một cách rõ ràng with=FALSE. Nó tuyệt vời! Xem ở đây để biết các cam kết cụ thể, bao gồm mục TIN TỨC mô tả sự thay đổi.
Josh O'Brien

43

Hơi dài dòng một chút, nhưng tôi đã quen với việc sử dụng .SDbiến ẩn .

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

Hơi rắc rối một chút, nhưng bạn không mất đi các tính năng dữ liệu khác (tôi không nghĩ vậy), vì vậy bạn vẫn có thể sử dụng các chức năng quan trọng khác như bảng tham gia, v.v.


6
Không rắc rối và rất hữu ích khi tạo danh sách cột theo chương trình
Chris

39

Nếu bạn muốn sử dụng tên cột để chọn các cột, chỉ cần sử dụng .(), đó là bí danh cho 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

Từ v1.10.2 trở đi, bạn cũng có thể sử dụng ..

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

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

dt[, ..keep_cols]

3
Cảm ơn câu trả lời này. Tôi cũng tìm thấy dt[, !..keep_cols]dt[, -..keep_cols] làm việc như mong đợi!
IceCreamToucan

3

@Tom, cảm ơn bạn rất nhiều vì đã chỉ ra giải pháp này. Đó là công việc tốt cho tôi.

Tôi đang tìm cách để loại trừ một cột khỏi in và từ ví dụ trên. Để loại trừ cột thứ hai, bạn có thể làm một cái gì đó như thế này

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)]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.