2013-05-19 40 views
57

Cách chính xác để xóa nhiều cột khỏi dữ liệu là gì? Tôi hiện đang sử dụng mã bên dưới, nhưng đã nhận được hành vi bất ngờ khi tôi vô tình lặp lại một trong các tên cột. Tôi đã không chắc chắn nếu đây là một lỗi, hoặc nếu tôi không nên loại bỏ cột theo cách này.Xóa nhiều cột khỏi data.table

library(data.table) 
DT <- data.table(x = letters, y = letters, z = letters) 
DT[ ,c("x","y") := NULL] 
names(DT) 
[1] "z" 

Các công trình trên tốt, nhưng

DT <- data.table(x = letters, y = letters, z = letters) 
DT[ ,c("x","x") := NULL] 
names(DT) 
[1] "z" 
+3

+1. Thú vị tìm thấy. Nếu bạn xóa hai chữ "y", bạn sẽ bị "x" sang trái. Và nếu bạn xóa hai "z" s nó bị treo! – Frank

+4

Bây giờ bạn có thể bọc LHS của ': =' gán trong một lời gọi đến 'unique()' (tức là sử dụng 'DT [, unique (c (" x "," x ")): = NULL]') để phòng thủ thêm. Vì điều này có vẻ giống như một lỗi ** data.table **, tôi đoán bạn sẽ chỉ phải làm điều đó cho đến khi Matthew Dowle chuyển cuộc gọi đó đến 'unique()' (hoặc cái gì đó tương đương với nó) bên trong '[ .data.table() ' –

+0

Ý tưởng hay về duy nhất. Cảm ơn. –

Trả lời

32

này trông giống như một, lỗi tái sản xuất rắn. Nó đã được nộp là Bug #2791.

Dường như lặp lại cột cố gắng xóa các cột tiếp theo.
Nếu không có cột nào, thì R bị treo.


CẬP NHẬT: Bây giờ cố định trong v1.8.11. Từ NEWS:

Gán vào cùng một cột hai lần trong cùng một truy vấn giờ đây là lỗi chứ không phải là sự cố trong một số trường hợp; ví dụ: DT [, c ("B", "B"): = NULL] (xóa bằng tham chiếu cùng một cột hai lần). Nhờ Ricardo (#2751) và matt_k (#2791) để báo cáo. Đã thêm thử nghiệm.

+0

Tôi muốn thêm rằng cú pháp chấm (được sử dụng như một phím tắt cho danh sách trong một số DT ops) sẽ không hoạt động ở đây, tức là 'DT [,. (" X "," x "): = NULL]' sẽ thất bại. Có vẻ như nó phải là một vectơ tên của các cột như là chuỗi. – Bar

11

Câu hỏi này đã được trả lời nhưng coi đây là một lưu ý phụ.

tôi thích cú pháp sau để thả nhiều cột

DT[ ,`:=`(x = NULL, y = NULL)] 

vì nó phù hợp với một thêm nhiều cột (biến)

DT[ ,`:=`(x = letters, y = "Male")] 

này cũng kiểm tra các tên cột trùng lặp. Vì vậy, cố gắng để thả x hai lần sẽ ném một thông báo lỗi.

Các vấn đề liên quan