Saya memiliki bingkai data bernama "mydata" yang terlihat seperti ini:
A B C D
1. 5 4 4 4
2. 5 4 4 4
3. 5 4 4 4
4. 5 4 4 4
5. 5 4 4 4
6. 5 4 4 4
7. 5 4 4 4
Saya ingin menghapus baris 2,4,6. Misalnya, seperti ini:
A B C D
1. 5 4 4 4
3. 5 4 4 4
5. 5 4 4 4
7. 5 4 4 4
Jawaban:
Ide kuncinya adalah Anda membentuk satu set baris yang ingin Anda hapus, dan menjaga komplemen dari set itu.
Dalam R, komplemen dari set diberikan oleh operator '-'.
Jadi, dengan asumsi
data.frame
disebutmyData
:Tentu saja, jangan lupa untuk "menetapkan kembali"
myData
jika Anda ingin menghapus semua baris itu --- jika tidak, R hanya akan mencetak hasilnya.sumber
,
di sana! ;)drop = FALSE
di sana.-
tidak akan berhasil, karena operator komplemen untuk logika adalah!
. Komplemen c (2,4,6) dalam baris lebih suka setdiff (c (2,4,6), 1: nrow (myData)), yang bukan c (-2, -4, -6) , meskipun keduanya akan menghasilkan baris yang sama saat digunakan dengan[
.myData[-c(2, 4, 6),,drop=F]
,. Bahkan, saya menyarankan agar Anda selalu menyisipkan,drop=F
tepat sebelum]
dalam akses matriks apa pun.Anda juga dapat bekerja dengan vektor boolean, alias
logical
:Perhatikan bahwa
!
operator bertindak sebagai TIDAK, yaitu!TRUE == FALSE
:Ini tampaknya sedikit rumit dibandingkan dengan jawaban @ mrwab (+1 btw :)), tetapi vektor logis dapat dihasilkan dengan cepat, misalnya di mana nilai kolom melebihi nilai tertentu:
Anda dapat mengubah vektor boolean menjadi vektor indeks:
Akhirnya, trik yang sangat rapi adalah Anda dapat menggunakan jenis pengesahan seperti ini tidak hanya untuk ekstraksi, tetapi juga untuk tugas:
di mana kolom
A
ditugaskanNA
(bukan angka) di manaA
melebihi 4.sumber
Masalah dengan menghapus nomor baris
Untuk analisis cepat dan kotor, Anda dapat menghapus baris data.frame dengan nomor sesuai jawaban teratas. Yaitu,
Namun, jika Anda mencoba untuk menulis skrip analisis data yang kuat, Anda umumnya harus menghindari menghapus baris dengan posisi numerik. Ini karena urutan baris dalam data Anda dapat berubah di masa mendatang. Prinsip umum dari data.frame atau tabel database adalah bahwa urutan baris tidak masalah. Jika pesanan itu penting, ini harus dikodekan dalam variabel aktual di data.frame.
Misalnya, bayangkan Anda mengimpor dataset dan menghapus baris dengan posisi numerik setelah memeriksa data dan mengidentifikasi nomor baris dari baris yang ingin Anda hapus. Namun, di beberapa titik nanti, Anda masuk ke data mentah dan melihat-lihat dan menyusun ulang data. Kode penghapusan baris Anda sekarang akan menghapus baris yang salah, dan lebih buruk lagi, Anda tidak akan mendapatkan kesalahan yang memperingatkan Anda bahwa ini telah terjadi.
Strategi yang lebih baik
Strategi yang lebih baik adalah menghapus baris berdasarkan pada properti substantif dan stabil pada baris. Misalnya, jika Anda memiliki
id
variabel kolom yang secara unik mengidentifikasi setiap kasus, Anda bisa menggunakannya.Di lain waktu, Anda akan memiliki kriteria pengecualian formal yang dapat ditentukan, dan Anda dapat menggunakan salah satu dari banyak alat subsetting di R untuk mengecualikan kasus berdasarkan aturan itu.
sumber
Buat kolom id di bingkai data Anda atau gunakan nama kolom apa pun untuk mengidentifikasi baris. Menggunakan indeks tidak adil untuk dihapus.
Gunakan
subset
fungsi untuk membuat bingkai baru.sumber
Dengan urutan yang disederhanakan:
Dengan urutan:
Dengan urutan negatif:
Atau jika Anda ingin subset dengan memilih angka ganjil:
Atau jika Anda ingin subset dengan memilih angka ganjil, versi 2:
Atau jika Anda ingin subset dengan menyaring angka genap:
Atau jika Anda ingin subset dengan menyaring angka genap, versi 2:
sumber
Hapus Dan dari employee.data - Tidak perlu mengelola data.frame baru.
sumber
Berikut adalah fungsi cepat dan kotor untuk menghapus baris demi indeks.
Kelemahan utamanya adalah argumen row_index tidak mengikuti pola R sebagai vektor nilai. Mungkin ada masalah lain karena saya hanya menghabiskan beberapa menit menulis dan mengujinya, dan baru mulai menggunakan R dalam beberapa minggu terakhir. Setiap komentar dan perbaikan tentang hal ini akan sangat disambut baik!
sumber
Untuk kelengkapan, saya akan menambahkan bahwa ini bisa dilakukan dengan
dplyr
menggunakan jugaslice
. Keuntungan menggunakan ini adalah bisa menjadi bagian dari alur kerja yang disalurkan.Tentu saja, Anda juga bisa menggunakannya tanpa pipa.
Format "bukan vektor",
-c(2, 4, 6)
artinya mendapatkan semua yang tidak ada di baris 2, 4, dan 6. Sebagai contoh menggunakan rentang, katakanlah Anda ingin menghapus 5 baris pertama, bisa Anda lakukanslice(df, 6:n())
. Untuk lebih banyak contoh, lihat dokumen .sumber