Hapus seluruh kolom dari data.frame di R

267

Adakah yang tahu cara menghapus seluruh kolom dari data.frame di R? Misalnya jika saya diberi data ini.frame:

> 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

dan saya ingin menghapus kolom ke-2.

Nanami
sumber
1
Kemungkinan duplikat kolom Drop dalam bingkai data R
jangorecki

Jawaban:

414

Anda dapat mengaturnya 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

Seperti yang ditunjukkan dalam komentar, berikut adalah beberapa kemungkinan lain:

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

Anda dapat menghapus banyak kolom melalui:

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

Berhati-hatilah dengan subset matriks, karena Anda bisa berakhir dengan vektor:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame
Joshua Ulrich
sumber
48
atau Anda dapat menggunakan: Data <- Data [, - 2]
Ian Fellows
2
dengan koma Anda juga dapat mengontrol argumen "drop", yang ketika FALSE berarti data.frame tetap data.frame ketika hasilnya hanya terdiri dari satu kolom - tanpa koma Anda akan selalu mendapatkan data.frame apakah beberapa kolom adalah kiri atau hanya satu - drop diabaikan untuk ekstraksi [-2]
mdsumner
3
@mdsumner Data[-2]tidak perlu dropargumen karena itu selalu kembali data.framedari data.frame. Dan saya pikir ini adalah cara yang jauh lebih baik untuk melokalkan kolom (dan hanya kolom) di data.frame(dan lebih cepat). Periksa: cars[-1](satu col data.frame) atau lebih baik cars[-(1:2)]: data frame with 0 columns and 50 rows.
Marek
1
Anda juga dapat menulis Data [2] <- NULL
Wojciech Sobala
11
Tip minor: Saat menghapus banyak kolom Data[c(1,2)]<-list(NULL)diperlukan.
Marek
69

Untuk menghapus satu atau lebih kolom dengan nama, ketika nama kolom diketahui (sebagai lawan ditentukan saat run-time), saya suka subset()sintaksnya. Misalnya untuk frame data

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

untuk menghapus hanya akolom yang bisa Anda lakukan

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

dan untuk menghapus bdan dkolom yang bisa Anda lakukan

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

Anda dapat menghapus semua kolom antara ddan bdengan:

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

Seperti yang saya katakan di atas, sintaks ini hanya berfungsi ketika nama kolom diketahui. Ini tidak akan berfungsi ketika katakanlah nama kolom ditentukan secara terprogram (yaitu ditugaskan ke variabel). Saya akan mereproduksi Peringatan ini dari ?subsetdokumentasi:

Peringatan:

Ini adalah fungsi kenyamanan yang dimaksudkan untuk digunakan secara interaktif. Untuk pemrograman, lebih baik menggunakan fungsi standar subsetting seperti '[', dan khususnya evaluasi non-standar argumen 'subset' dapat memiliki konsekuensi yang tidak terduga.

Prasad Chalasani
sumber
26

(Untuk kelengkapan) Jika Anda ingin menghapus kolom dengan nama, Anda dapat melakukan ini:

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]

Termasuk drop = Fmemastikan bahwa hasilnya akan tetap menjadi data.framebahkan jika hanya satu kolom tersisa.

langit-langit kucing
sumber
22

Jawaban yang diposting sangat baik ketika bekerja dengan data.frames. Namun, tugas-tugas ini bisa sangat tidak efisien dari perspektif memori. Dengan data besar, menghapus kolom bisa memakan waktu lama dan / atau gagal karena out of memorykesalahan. Paket data.tablemembantu mengatasi masalah ini dengan :=operator:

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

Saya harus memberikan contoh yang lebih besar untuk menunjukkan perbedaan. Saya akan memperbarui jawaban ini di beberapa titik dengan itu.

Mengejar
sumber
3
The data.table::setFungsi dapat digunakan pada data.frames untuk menghapus atau mengubah kolom langsung, tanpa membuat salinan. Lihat di sini
GSee
8

Ada beberapa opsi untuk menghapus satu atau lebih kolom dengan dplyr::select()dan beberapa fungsi pembantu. Fungsi helper dapat bermanfaat karena beberapa tidak mengharuskan penamaan semua kolom tertentu untuk dihapus. Perhatikan bahwa untuk menjatuhkan kolom menggunakan select()Anda harus menggunakan terkemuka -untuk meniadakan nama kolom.

Menggunakan dplyr::starwarsdata sampel untuk beberapa variasi dalam nama kolom:

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 

Anda juga dapat memberikan nomor kolom:

starwars %>% 
  select(-2, -(4:10)) # column 2 and columns 4 through 10
sbha
sumber
Jawaban yang bagus Adakah gagasan tentang cara menjatuhkan kolom yang berisi nilai tertentu di salah satu barisnya (bukan dalam nama kolomnya seperti yang Anda usulkan di atas)?
Laura K
df [, - which (sapply (df, function (x) any (x == a)))]], di mana df adalah bingkai data Anda dan a adalah nilai spesifik Anda, mis .: mtcars [, - that (sapply (mtcars, function (x) any (x == 4)))]
Nanami
7

Dengan ini, Anda dapat menghapus columndan menyimpan variableke yang lain variable.

df = subset(data, select = -c(genome) )
Nirali Khoda
sumber