Saya harus memfilter bingkai data menggunakan kriteria baris yang berisi string RTB
.
Saya menggunakan dplyr
.
d.del <- df %.%
group_by(TrackingPixel) %.%
summarise(MonthDelivery = as.integer(sum(Revenue))) %.%
arrange(desc(MonthDelivery))
Saya tahu saya dapat menggunakan fungsi filter
di dplyr
tapi saya tidak persis bagaimana untuk menceritakannya untuk memeriksa isi dari string.
Khususnya saya ingin memeriksa konten di kolom TrackingPixel
. Jika string berisi label RTB
saya ingin menghapus baris dari hasilnya.
dplyr
, tetapi melihat bantuan di?dplyr::filter
saya akan menyarankan sesuatu sepertifilter(df, !grepl("RTB",TrackingPixel))
mungkin?RTB
dan tidak menunjukkan yang lain.!
di depangrepl
- coba lagi.invert
dan . Ekspresi reguler membuat bekerja dengan teks seribu kali lebih mudah.value
grep
grepl
tidak berfungsi pada postgres untuk saya, apakah ini untuk MySQL?Jawaban:
Jawaban atas pertanyaan sudah diposting oleh @latemail di komentar di atas. Anda dapat menggunakan ekspresi reguler untuk argumen kedua dan selanjutnya
filter
seperti ini:Karena Anda belum memberikan data asli, saya akan menambahkan contoh mainan menggunakan
mtcars
set data. Bayangkan Anda hanya tertarik pada mobil yang diproduksi oleh Mazda atau Toyota.Jika Anda ingin melakukan hal sebaliknya, yaitu mengecualikan mobil Toyota dan Mazda,
filter
perintahnya terlihat seperti ini:sumber
mtcars$`my type` <- rownames(mtcars)
dan kemudianmtcars %>% filter(grepl('Toyota|Mazda', `my type`))
tbl_sql
asgrepl
tidak menerjemahkan ke sql.Larutan
Hal ini dimungkinkan untuk menggunakan
str_detect
satustringr
paket termasuk dalamtidyverse
paket.str_detect
mengembalikanTrue
atauFalse
apakah vektor yang ditentukan berisi beberapa string tertentu. Dimungkinkan untuk memfilter menggunakan nilai boolean ini. Lihat Pengantar stringr untuk detail tentangstringr
paket.Hal-hal baik tentang Stringr
Kita harus menggunakan
stringr::str_detect()
daripadabase::grepl()
. Ini karena ada alasan berikut.stringr
paket dimulai dengan awalanstr_
, yang membuat kode lebih mudah dibaca.stringr
paket adalah selalu data.frame (atau nilai), kemudian muncul parameternya. (Terima kasih, Paolo)Tolok ukur
Hasil uji benchmark adalah sebagai berikut. Untuk kerangka data yang besar,
str_detect
lebih cepat.sumber
stringr
paket dimulai dengan awalan str_, yang membuat kode lebih mudah dibaca. Dalam kode R modern baru-baru ini, disarankan untuk menggunakan stringr.base R
sama baiknyastringr
. Jika Anda memberi kami beberapa 'fakta sulit' seperti benchmarking, dan tidak hanya menyatakan "direkomendasikan" (Siapa yang merekomendasikannya?), Ini akan sangat dihargai. Terima kasihJawaban ini mirip dengan yang lain, tetapi menggunakan yang disukai
stringr::str_detect
dan dplyrrownames_to_column
.Dibuat pada 2018-06-26 oleh paket reprex (v0.2.0).
sumber
str_detect
ada dalamstringr
paketsunting termasuk
across()
sintaks yang lebih baruInilah
tidyverse
solusi lain , menggunakanfilter(across())
atau sebelumnyafilter_at
. Keuntungannya adalah Anda dapat dengan mudah memperluas ke lebih dari satu kolom .Di bawah ini juga solusi dengan
filter_all
untuk menemukan string di kolom apa pun , menggunakandiamonds
sebagai contoh, mencari string "V"String hanya dalam satu kolom
Sintaks yang sekarang digantikan untuk hal yang sama adalah:
String di semua kolom:
Sintaks yang sekarang digantikan untuk hal yang sama adalah:
Saya mencoba mencari alternatif lain untuk hal-hal berikut, tetapi saya tidak segera menemukan solusi yang baik:
Pembaruan: Terima kasih kepada pengguna Petr Kajzar dalam jawaban ini , berikut ini juga pendekatan untuk yang di atas:
sumber