Untuk menghilangkan kolom bernama "foo" dalam data.frame
, saya dapat melakukan:
df <- df[-grep('foo', colnames(df))]
Namun, setelah df
dikonversi ke data.table
objek, tidak ada cara untuk hanya menghapus kolom.
Contoh:
df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))]
Tapi begitu dikonversi menjadi data.table
objek, ini tidak lagi berfungsi.
r
data.table
Maiasaura
sumber
sumber
dt
bukannyadf3
...Jawaban:
Salah satu dari yang berikut ini akan menghapus kolom
foo
dari tabel datadf3
:data.table juga mendukung sintaks berikut:
meskipun jika Anda benar-benar ingin menghapus kolom
"foo"
daridf3
(bukan hanya mencetak tampilandf3
kolom minus"foo"
) Anda benar-benar ingin menggunakan Metode 1 sebagai gantinya.(Perhatikan bahwa jika Anda menggunakan metode yang mengandalkan
grep()
ataugrepl()
, Anda perlu mengaturpattern="^foo$"
daripada"foo"
, jika Anda tidak ingin kolom dengan nama seperti"fool"
dan"buffoon"
(yaitu yang mengandungfoo
sebagai substring) juga dicocokkan dan dihapus.)Opsi yang kurang aman, baik untuk penggunaan interaktif:
Dua idiom berikutnya juga akan berfungsi - jika
df3
berisi kolom yang cocok"foo"
- tetapi akan gagal dengan cara yang mungkin tidak terduga jika tidak. Jika, misalnya, Anda menggunakan salah satu dari mereka untuk mencari kolom yang tidak ada"bar"
, Anda akan berakhir dengan tabel data baris-nol.Sebagai konsekuensinya, mereka benar-benar paling cocok untuk penggunaan interaktif di mana orang mungkin, misalnya, ingin menampilkan data
"foo"
. Untuk tujuan pemrograman (atau jika Anda ingin benar-benar menghapus kolom daridf3
daripada dari salinannya), Metode 1, 2a, dan 2b benar-benar merupakan pilihan terbaik.Terakhir ada pendekatan menggunakan
with=FALSE
, meskipundata.table
secara bertahap menjauh dari menggunakan argumen ini sehingga sekarang tidak disarankan di mana Anda bisa menghindarinya; ditampilkan di sini sehingga Anda tahu opsi ada jika Anda benar-benar membutuhkannya:sumber
-grep
versus!grepl
.grepl()
initally dan tidak berhasil, karena kolom data.table tidak dapat diindeks oleh vektor logis. Tapi sekarang saya menyadari bahwagrepl()
ini dapat dibuat untuk bekerja dengan membungkusnyawhich()
, sehingga mengembalikan vektor integer.data.table
, tetapi membungkusnya denganwhich
cerdas!data.table
itu; menambahkan FR # 1797 . Tetapi, metode 1 (hampir) jauh lebih cepat daripada yang lain. Metode 1 menghapus kolom dengan referensi tanpa salinan sama sekali. Saya ragu Anda mendapatkannya di atas 0,005 detik untuk semua data ukuran. Sebaliknya, yang lain mungkin tidak berfungsi sama sekali jika tabelnya mendekati 50% dari RAM karena mereka menyalin semua kecuali yang dihapus.Anda juga dapat menggunakan
set
ini, yang menghindari overhead[.data.table
dalam loop:Jika Anda ingin melakukannya dengan nama kolom,
which(colnames(dt) %in% c("a","c","e"))
harus berhasilj
.sumber
data.table
1.11.8, jika Anda ingin melakukannya dengan nama kolom, Anda dapat melakukannya secara langsungrm.col = c("a","b")
dandt[, (rm.col):=NULL]
Saya cukup melakukannya dalam bingkai data cara:
Bekerja cepat dan sejauh yang saya lihat tidak menimbulkan masalah.
PEMBARUAN: bukan metode terbaik jika DT Anda sangat besar, karena menggunakan
$<-
operator akan menyebabkan penyalinan objek. Jadi lebih baik gunakan:sumber
Opsi yang sangat sederhana jika Anda memiliki banyak kolom individual untuk dihapus dalam tabel data dan Anda ingin menghindari mengetikkan semua nama kolom #careadviced
Ini akan menghapus kolom berdasarkan nomor kolom sebagai gantinya.
Ini jelas tidak seefisien karena memotong keuntungan data. Tetapi jika Anda bekerja dengan kurang dari 500.000 baris, itu berfungsi dengan baik
sumber
Misalkan dt Anda memiliki kolom
col1
,col2
,col3
,col4
,col5
,coln
.Untuk menghapus sebagian dari mereka:
sumber
Berikut adalah cara ketika Anda ingin mengatur # kolom ke NULL mengingat nama kolom mereka fungsi untuk penggunaan Anda :)
sumber
sumber
Untuk tabel data, menetapkan kolom ke NULL menghapusnya:
... yang setara dengan:
Setara untuk data.frame adalah:
P. Mengapa ada koma di versi untuk data.table, dan tidak ada koma di versi untuk data.frame?
A. Karena data.frame disimpan sebagai daftar kolom, Anda dapat melewati koma. Anda juga dapat menambahkannya, namun kemudian Anda harus menetapkannya ke daftar
NULL
sDF[, c("col1", "col2", "col3")] <- list(NULL)
,.sumber
data.frames
mana baris dan kolom akan diaktifkan. Itu tidak masuk akal.DF[column,row]
jadi saya hanya ingin melihat apakah sebenarnya ada kejadian di mana ini terjadi.