dplyr
とgrepl
を使用して、大きなデータセットからいくつかの観測値をフィルタリングする方法を考えています。他のソリューションがより最適な場合、私はgrepl
に結婚していません。
このサンプルdfを取ります:
_df1 <- data.frame(fruit=c("Apple", "orange", "xapple", "xorange",
"applexx", "orangexx", "banxana", "appxxle"), group=c("A", "B") )
df1
# fruit group
#1 Apple A
#2 orange B
#3 xapple A
#4 xorange B
#5 applexx A
#6 orangexx B
#7 banxana A
#8 appxxle B
_
したい:
「x」または「xx」を含むすべてのものを取り除く方法を考え出すことができましたが、最初または最後で終わっていません。以下は、「で終わる」だけではなく、「xx」が含まれるすべてのものを取り除く方法です。
_df1 %>% filter(!grepl("xx",fruit))
# fruit group
#1 Apple A
#2 orange B
#3 xapple A
#4 xorange B
#5 banxana A
_
これは明らかに(誤って)(私の観点から)「appxxle」をフィルタリングしました。
正規表現を完全に理解できたことはありません。私は次のようなコードを変更しようとしました:grepl("^(?!x).*$", df1$fruit, Perl = TRUE)
フィルターコマンド内で動作するようにしようとしましたが、まだうまくいきません。
期待される出力:
_# fruit group
#1 Apple A
#2 orange B
#3 banxana A
#4 appxxle B
_
可能であれば、dplyr
内でこれを実行したいと思います。
私はあなたの2番目の正規表現を理解していませんでしたが、このより基本的な正規表現はトリックを行うようです:
df1 %>% filter(!grepl("^x|xx$", fruit))
###
fruit group
1 Apple A
2 orange B
3 banxana A
4 appxxle B
そして、あなたはこれを知っていると仮定しますが、dplyr
をここで使用する必要はまったくありません。
df1[!grepl("^x|xx$", df1$fruit), ]
###
fruit group
1 Apple A
2 orange B
7 banxana A
8 appxxle B
正規表現は、x
OR xx
で終わる文字列を探します。^
と$
は、正規表現のアンカーです。 |
はOR演算子です。!
でgrepl
の結果を否定しているので、 「正規表現の中にあるものと一致しない文字列を見つけています。