Drop data frame kolom dengan nama

Saya memiliki jumlah kolom yang ingin saya hapus dari data frame. Saya tahu bahwa kita dapat menghapusnya secara individual menggunakan sesuatu seperti:

df$x <- NULL

Tapi saya berharap untuk melakukan hal ini dengan perintah lebih sedikit.

Juga, saya tahu bahwa saya bisa drop kolom menggunakan integer indeks seperti ini:

df <- df[ -c(1, 3:6, 12) ]

Tapi saya khawatir bahwa posisi relatif dari variabel saya dapat berubah.

Mengingat betapa kuat R adalah, saya pikir mungkin ada cara yang lebih baik daripada menjatuhkan setiap kolom satu per satu.

Mengomentari pertanyaan (2)
Larutan

Anda dapat menggunakan sederhana daftar nama-nama :


DF 
Komentar (6)

Ada's juga bagian perintah, yang berguna jika anda tahu mana kolom yang anda inginkan:


df 
Komentar (10)
within(df, rm(x))

mungkin yang paling mudah, atau untuk beberapa variabel:

within(df, rm(x, y))

Atau jika anda're berurusan dengan `data.tabel (per https://stackoverflow.com/q/9202413):

dt[, x := NULL]   # Deletes column x by reference instantly.

dt[, !"x"]   # Selects all but x into a new data.table.

atau untuk beberapa variabel

dt[, c("x","y") := NULL]

dt[, !c("x", "y")]
Komentar (6)

Anda bisa menggunakan %di% seperti ini:

df[, !(colnames(df) %in% c("x","bar","foo"))]
Komentar (3)

daftar(NULL) juga bekerja:


dat 
Komentar (6)

Jika anda ingin menghapus kolom dengan referensi dan menghindari internal menyalin yang terkait dengan data.frame maka anda dapat menggunakan data.tabel paket dan fungsi :=

Anda dapat melewati karakter vektor nama ke sisi kiri := operator, dan NULL sebagai RHS.


library(data.table)

df 
Komentar (0)

Ada berpotensi lebih kuat strategi didasarkan pada kenyataan bahwa grep() akan mengembalikan vektor numerik. Jika anda memiliki daftar panjang dari variabel-variabel seperti yang saya lakukan di salah satu kumpulan data saya, beberapa variabel yang berakhir pada "." dan lain-lain yang akhirnya di ".B" dan anda hanya ingin orang-orang itu di ".A" (bersama dengan semua variabel yang don't mencocokkan pola, lakukan ini:


dfrm2 
Komentar (1)

Lain dplyr jawaban. Jika variabel anda memiliki beberapa kesamaan struktur penamaan, anda mungkin mencoba starts_with(). Misalnya


library(dplyr)
df 
Komentar (1)

DF 
Komentar (0)

Keluar dari bunga, bendera ini sampai salah satu dari R's aneh beberapa sintaks inkonsistensi. Misalnya diberikan dua kolom data frame:


df 
Komentar (0)

Kemungkinan lain:


df 
Komentar (2)

Dplyr Solusi

Saya ragu ini akan mendapatkan banyak perhatian di sini, tetapi jika anda memiliki daftar kolom yang ingin anda hapus, dan anda ingin melakukannya dalam dplyr rantai saya menggunakan one_of() dalam pilih ayat:

Berikut ini adalah sederhana, reproducable contoh:


undesired 
Komentar (2)

Berikut adalah dplyr cara untuk pergi tentang itu:

#df[ -c(1,3:6, 12) ]  # original
df.cut % select(-col.to.drop.1, -col.to.drop.2, ..., -col.to.drop.6)  # with dplyr::select()

Aku seperti ini karena itu's intuitif untuk membaca & mengerti tanpa penjelasan dan kuat untuk kolom mengubah posisi dalam data frame. Hal ini juga mengikuti vectorized idiom menggunakan - untuk menghapus elemen.

Komentar (2)

Aku terus berpikir pasti ada yang lebih baik idiom, tetapi untuk pengurangan kolom dengan nama, saya cenderung untuk melakukan hal-hal berikut:


df 
Komentar (2)

Ada's sebuah fungsi yang disebut dropNamed() di Bernd Bischl's BBmisc paket yang tidak tepat ini.

BBmisc::dropNamed(df, "x")

Keuntungan adalah bahwa ia menghindari pengulangan data frame argumen dan dengan demikian cocok untuk pipa dalam magrittr (seperti dplyr pendekatan):

df %>% BBmisc::dropNamed("x")
Komentar (0)

Solusi lain jika anda don't ingin menggunakan @hadley's atas: Jika "COLUMN_NAME" adalah nama kolom yang ingin anda drop:

df[,-which(names(df) == "COLUMN_NAME")]
Komentar (2)

Di luar pilih(-one_of(drop_col_names)) ditunjukkan dalam jawaban sebelumnya, ada beberapa lainnya dplyr pilihan untuk menjatuhkan kolom menggunakan select() yang tidak melibatkan mendefinisikan semua spesifik nama-nama kolom (menggunakan dplyr starwars data sampel untuk beberapa variasi dalam nama-nama kolom):

library(dplyr)
starwars %>% 
  select(-(name:mass)) %>%        # the range of columns from 'name' to 'mass'
  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('^f.+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

1 Tatooine  Human  
2 Tatooine  Droid 
Komentar (0)

Memberikan data frame dan string *koma nama* untuk menghapus:


remove_features 
Komentar (0)

Menemukan indeks kolom yang ingin anda tarik menggunakan yang. Memberikan indeks ini tanda negatif (*-1). Maka subset pada nilai-nilai tersebut, yang akan menghapus mereka dari dataframe. Ini adalah contoh.


DF 
Komentar (0)