2012-03-21 41 views
15

Có cách nào để chọn tất cả các cột của một khung dữ liệu ngoại trừ cột có tên cụ thể không: nó sẽ là số tương tự của df[,-1], ngoại trừ việc sử dụng tên cột thay vì chỉ mục?bỏ chọn một cột theo tên, R

Trả lời

37

Bạn có thể thực hiện việc này bằng cách sử dụng đặt trước vector. Đầu tiên, tạo một tập dữ liệu giả:

R> dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3) 

Sau đó sử dụng các nhà điều hành ! để đảo ngược lựa chọn:

R> dd[ ,!(colnames(dd) == "A")] 

    B C D 
1 1 1 1 
2 2 2 2 
3 3 3 3 

Ngoài ra, bạn có thể có:

  • Một phiên bản hơi ngắn hơn (lịch sự của @Tomas):

    dd[ , names(dd) != "A"] 
    
  • Để đối phó với nhiều cột (biếu không của @Tyler)

    dd[ ,!(colnames(dd) %in% c("A", "B"))] 
    
7

Người ta có thể sử dụng which() chức năng để xác định các cột để được loại bỏ.

dd <- data.frame(A = 1:5, B = 1:5, C=1:5) 

dd[, -which(names(dd) == "A")] 

hoặc tích cực

dd[, which(names(dd) != "A")] 

Tuy nhiên, nếu không có cột có tên là "A", bạn sẽ nhận được một khung dữ liệu với 0 cột và nrow(dd) hàng. Vì vậy, nó sẽ là tốt để kiểm tra sự tồn tại của một cột có tên là "A".

if(any(names(dd) == "A")) { 
    dd[, which(names(dd) != "A")] 
} 
5

Chức năng subset đã cho phép loại hình này của cú pháp, từ các ví dụ trên trang trợ giúp:

subset(airquality, Day == 1, select = -Temp) 
0

Đối với việc không chọn nhiều cột, bạn có thể sử dụng gói dplyr. Ví dụ:

dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3) 

library(dplyr) 
newdd <- select(dd, -A,-C) 

đây là một cách khác ngoài những gì @csgillespie đề xuất.

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