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
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"))]
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")]
}
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)
Đố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.