Saya mencoba menggunakan grep
untuk menguji apakah vektor string ada dalam vektor lain atau tidak, dan untuk menghasilkan nilai yang ada (pola yang cocok).
Saya memiliki bingkai data seperti ini:
FirstName Letter
Alex A1
Alex A6
Alex A7
Bob A1
Chris A9
Chris A6
Saya memiliki vektor pola string dapat ditemukan di "Surat" kolom, misalnya: c("A1", "A9", "A6")
.
Saya ingin memeriksa apakah salah satu string dalam vektor pola ada di kolom "Surat". Jika ya, saya ingin output nilai unik.
Masalahnya adalah, saya tidak tahu bagaimana menggunakannya grep
dengan banyak pola. Saya mencoba:
matches <- unique (
grep("A1| A9 | A6", myfile$Letter, value=TRUE, fixed=TRUE)
)
Tapi itu memberi saya 0 kecocokan yang tidak benar, ada saran?
fixed=TRUE
karena pola Anda adalah ekspresi reguler yang benar .match
atau%in%
atau bahkan==
adalah satu - satunya cara yang benar untuk membandingkan kecocokan yang tepat. regex sangat berbahaya untuk tugas seperti itu dan dapat menyebabkan hasil yang tidak terduga.Jawaban:
Selain komentar @ Marek tentang tidak termasuk
fixed==TRUE
, Anda juga tidak perlu memiliki spasi dalam ekspresi reguler Anda. Seharusnya begitu"A1|A9|A6"
.Anda juga menyebutkan bahwa ada banyak pola. Dengan asumsi mereka berada dalam vektor
Kemudian Anda dapat membuat ekspresi reguler Anda secara langsung menggunakan
paste
dancollapse = "|"
.sumber
toMatch %in% myfile$Letter
?Jawaban yang bagus, namun jangan lupakan tentang
filter()
dplyr:sumber
grepl
bekerja dengan satu pola pada saat itu (kita perlu vektor dengan panjang 1), kita punya 3 pola (vektor panjang 3), jadi kita bisa menggabungkannya dengan satu menggunakan beberapa ramah untuk pemisah grepl -|
, coba keberuntunganmu dengan yang lain :))|(
pola yang terpisah mungkin membuat ini lebih kuat:paste0("(", paste(patterns, collapse=")|("),")")
. Sayangnya itu menjadi juga sedikit kurang elegan. Ini menghasilkan pola(A1)|(A9)|(A6)
.Ini seharusnya bekerja:
Atau bahkan lebih sederhana:
sumber
%like%
tidak ada dalam basis R, jadi Anda harus menyebutkan paket apa yang diperlukan untuk menggunakannya.%like%
adalah bagian daridata.table
paket. Juga di samadata.table
adalahlike(...)
,%ilike%
, dan%flike%
.Berdasarkan posting Brian Digg, berikut adalah dua fungsi yang membantu untuk memfilter daftar:
sumber
Sudahkah Anda mencoba
match()
ataucharmatch()
fungsinya?Contoh penggunaan:
sumber
match
adalah bahwa ia tidak menggunakan pola, ia mengharapkan kecocokan yang tepat.Tidak yakin apakah jawaban ini sudah muncul ...
Untuk pola tertentu dalam pertanyaan, Anda bisa melakukannya dengan satu
grep()
panggilan,sumber
Untuk menambah jawaban Brian Diggs.
cara lain menggunakan grepl akan mengembalikan bingkai data yang berisi semua nilai Anda.
Mungkin sedikit lebih bersih ... mungkin?
sumber
Singkirkan ruang. Begitu juga:
sumber
Menggunakan
sapply
sumber
Saya sarankan menulis skrip kecil dan melakukan beberapa pencarian dengan Grep. Saya tidak pernah menemukan cara untuk mencari beberapa pola, dan percayalah, saya sudah melihat!
Seperti itu, file shell Anda, dengan string yang disematkan:
Kemudian jalankan dengan mengetikkan myshell.sh.
Jika Anda ingin dapat meneruskan string pada baris perintah, lakukan seperti ini, dengan argumen shell - ini adalah bash notation btw:
Dan seterusnya.
Jika ada banyak pola yang cocok, Anda bisa memasukkannya dalam for loop.
sumber