Memfilter dataframe


12

Masih mempelajari fungsi dasar dalam R, Fungsi subset tampaknya hanya memfilter kondisi berdasarkan kolom tunggal dengan atau tanpa beberapa kondisi?

Bagaimana saya bisa dengan mudah menyaring data dari bingkai data?

  1. ketika Anda disediakan dengan berbagai kondisi

  2. Ketika kondisi perlu diterapkan di kolom yang tersedia.

Contoh: Diberi bingkai data yang berisi

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

katakanlah saya ingin memfilter dataframe ini sehingga hanya nama di mana salah satu D1 ke D4 adalah 'E' maka saya harus memiliki,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

Katakanlah bahwa D1 dapat berupa daftar kolom yang besar, bagaimana atau apa pendekatan yang disarankan untuk melakukan filter ini? Terima kasih

Jawaban:


26

Jika Anda ingin menggabungkan beberapa filter dalam fungsi subset, gunakan operator logis:

 subset(data, D1 == "E" | D2 == "E")

akan memilih baris yang kolom D1 atau kolom D2 bernilai "E". Lihat halaman bantuan untuk operator logis yang tersedia:

 > ?"|"

Untuk pertanyaan kedua yang Anda butuhkan adalah memfilter baris. Ini dapat dicapai dengan cara berikut

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

Argumen pertama untuk menerapkan memberi suplai pada kolom yang harus disaring. Argumen kedua adalah 1, artinya kita mengulang-ulang baris data. Argumen ketiga adalah fungsi satu baris tanpa nama yang mengembalikan BENAR jika "E" hadir di baris dan FALSE jika "E" tidak ada.

Hasil dari fungsi yang diterapkan adalah sel vektor logis , yang memiliki panjang sama dengan jumlah baris dalam data. Kami kemudian menggunakan vektor ini untuk memilih baris yang diperlukan.

Memperbarui

Hal yang sama dapat dicapai dengan grep:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

dalam R grep dengan argumen default mengembalikan jumlah elemen dalam vektor yang disediakan yang memiliki pola yang cocok.


2
fungsi lain yang bermanfaat adalah any. Sebagai contoh jika Anda ingin memeriksa bahwa setidaknya satu elemen dari vektor adalah = 10Anda dapat menulis ( any(v==10)).
nico

@nico ya, tapi 10% di% v memiliki 9 karakter dan varian dengan setiap 10 :). Meskipun untuk vektor numerik lebih baik menggunakan persamaan, karena R cerdas dan jika data Anda bilangan bulat dicampur dengan bilangan real, ia akan dengan benar mengenali bahwa Anda memiliki 10 dalam kumpulan data Anda.
mpiktas

bagaimana dengan kasus untuk ekspresi reguler? dengan asumsi bahwa Anda tidak ingin bekerja dengan pasangan yang tepat? Apakah mereka memiliki sesuatu yang dekat dengan ~ = seperti dalam bahasa lain? apa yang paling dekat dengan ungkapan itu dalam R
eastafri

@Biorelated See grepdan agrep, dan dokumentasi terkait pada POSIX 1003.2 atau reg-kompatibel Perl.
chl

@Belelated, saya sudah memperbarui jawabannya dengan contoh grep.
mpiktas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.