Xóa toàn bộ một cột khỏi data.frame trong R


267

Có ai biết cách xóa toàn bộ một cột khỏi data.frame trong R không? Ví dụ: nếu tôi được cung cấp dữ liệu này. Khung:

> head(data)
   chr       genome region
1 chr1 hg19_refGene    CDS
2 chr1 hg19_refGene   exon
3 chr1 hg19_refGene    CDS
4 chr1 hg19_refGene   exon
5 chr1 hg19_refGene    CDS
6 chr1 hg19_refGene   exon

và tôi muốn xóa cột thứ 2.


1
Có thể trùng lặp các cột Thả trong khung dữ liệu R
jangorecki

Câu trả lời:


414

Bạn có thể đặt nó thành NULL.

> Data$genome <- NULL
> head(Data)
   chr region
1 chr1    CDS
2 chr1   exon
3 chr1    CDS
4 chr1   exon
5 chr1    CDS
6 chr1   exon

Như đã chỉ ra trong các ý kiến, đây là một số khả năng khác:

Data[2] <- NULL    # Wojciech Sobala
Data[[2]] <- NULL  # same as above
Data <- Data[,-2]  # Ian Fellows
Data <- Data[-2]   # same as above

Bạn có thể xóa nhiều cột thông qua:

Data[1:2] <- list(NULL)  # Marek
Data[1:2] <- NULL        # does not work!

Hãy cẩn thận với việc đặt lại ma trận, vì bạn có thể kết thúc bằng một vectơ:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame

48
hoặc bạn có thể sử dụng: Dữ liệu <- Dữ liệu [, - 2]
Ian Fellows

2
với dấu phẩy, bạn cũng có thể kiểm soát đối số "thả", khi FALSE có nghĩa là data.frame giữ nguyên data.frame khi kết quả chỉ có một cột - không có dấu phẩy, bạn sẽ luôn nhận được data.frame cho dù có nhiều cột còn lại hoặc chỉ một - thả được bỏ qua cho trích xuất [-2]
mdsumner

3
@mdsumner Data[-2]không cần droptranh cãi vì nó luôn luôn quay trở lại data.frametừ data.frame. Và tôi nghĩ rằng đây là cách tốt hơn nhiều cho các cột được bản địa hóa (và chỉ các cột) trong data.frame(và nó nhanh hơn). Kiểm tra: cars[-1](một col data.frame) hoặc tốt hơn cars[-(1:2)]: data frame with 0 columns and 50 rows.
Marek

1
Bạn cũng có thể viết Dữ liệu [2] <- NULL
Wojciech Sobala

11
Mẹo nhỏ: Khi loại bỏ nhiều cột Data[c(1,2)]<-list(NULL)là cần thiết.
Marek

69

Để xóa một hoặc nhiều cột theo tên, khi tên cột được biết (trái ngược với việc được xác định tại thời điểm chạy), tôi thích subset()cú pháp. Ví dụ cho khung dữ liệu

df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6)

để loại bỏ chỉ acột bạn có thể làm

Data <- subset( Data, select = -a )

và để loại bỏ các cột bdbạn có thể làm

Data <- subset( Data, select = -c(d, b ) )

Bạn có thể xóa tất cả các cột giữa dbvới:

Data <- subset( Data, select = -c( d : b )

Như tôi đã nói ở trên, cú pháp này chỉ hoạt động khi biết tên cột. Nó sẽ không hoạt động khi nói tên cột được xác định theo chương trình (nghĩa là được gán cho một biến). Tôi sẽ sao chép Cảnh báo này từ ?subsettài liệu:

Cảnh báo:

Đây là một chức năng tiện lợi dành cho sử dụng tương tác. Để lập trình, tốt hơn là sử dụng các hàm đặt lại tiêu chuẩn như '[' và đặc biệt là việc đánh giá không chuẩn đối với 'tập hợp con' có thể gây ra hậu quả không lường trước được.


26

(Để hoàn thiện) Nếu bạn muốn xóa các cột theo tên, bạn có thể làm điều này:

cols.dont.want <- "genome"
cols.dont.want <- c("genome", "region") # if you want to remove multiple columns

data <- data[, ! names(data) %in% cols.dont.want, drop = F]

Bao gồm drop = Fđảm bảo rằng kết quả sẽ vẫn là data.framengay cả khi chỉ còn một cột.


22

Các câu trả lời được đăng rất tốt khi làm việc với data.frames. Tuy nhiên, các tác vụ này có thể khá kém hiệu quả từ góc độ bộ nhớ. Với dữ liệu lớn, việc xóa một cột có thể mất một khoảng thời gian dài bất thường và / hoặc thất bại do out of memorylỗi. Gói data.tablegiúp giải quyết vấn đề này với :=nhà điều hành:

library(data.table)
> dt <- data.table(a = 1, b = 1, c = 1)
> dt[,a:=NULL]
     b c
[1,] 1 1

Tôi nên đưa ra một ví dụ lớn hơn để thể hiện sự khác biệt. Tôi sẽ cập nhật câu trả lời này tại một số điểm với điều đó.


3
Các data.table::setchức năng có thể được sử dụng trên data.frames để loại bỏ hoặc sửa đổi một cột ngay lập tức, mà không làm bản. Xem tại đây
GSee

8

Có một số tùy chọn để xóa một hoặc nhiều cột với dplyr::select()và một số chức năng của trình trợ giúp. Các hàm trợ giúp có thể hữu ích vì một số không yêu cầu đặt tên tất cả các cột cụ thể được loại bỏ. Lưu ý rằng để thả các cột bằng cách sử dụng select()bạn cần sử dụng một hàng đầu -để phủ định tên cột.

Sử dụng dplyr::starwarsdữ liệu mẫu cho một số tên trong cột:

library(dplyr)

starwars %>% 
  select(-height) %>%                  # a specific column name
  select(-one_of('mass', 'films')) %>% # any columns named in one_of()
  select(-(name:hair_color)) %>%       # the range of columns from 'name' to 'hair_color'
  select(-contains('color')) %>%       # any column name that contains 'color'
  select(-starts_with('bi')) %>%       # any column name that starts with 'bi'
  select(-ends_with('er')) %>%         # any column name that ends with 'er'
  select(-matches('^v.+s$')) %>%       # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%          # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

Bạn cũng có thể thả theo số cột:

starwars %>% 
  select(-2, -(4:10)) # column 2 and columns 4 through 10

Câu trả lời chính xác. Bất kỳ ý tưởng về cách thả một cột có chứa một giá trị nhất định trong bất kỳ hàng nào của nó (không phải trong tên cột như bạn đề xuất ở trên)?
Laura K

df [, - which (sapply (df, function (x) any (x == a)))], trong đó df là khung dữ liệu của bạn và a là giá trị cụ thể của bạn, ví dụ: mtcars [, - which (sapply (mtcars, hàm (x) bất kỳ (x == 4)))]
Nanami

7

Với cái này bạn có thể loại bỏ columnvà lưu trữ variablevào cái khác variable.

df = subset(data, select = -c(genome) )
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.