web-dev-qa-db-ja.com

greplと組み合わせたdplyrでの観測のフィルタリング

dplyrgreplを使用して、大きなデータセットからいくつかの観測値をフィルタリングする方法を考えています。他のソリューションがより最適な場合、私は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
_

したい:

  1. 「x」で始まるケースを除外します
  2. 「xx」で終わるケースを除外します

「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内でこれを実行したいと思います。

30
jalapic

私はあなたの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の結果を否定しているので、 「正規表現の中にあるものと一致しない文字列を見つけています。

39
Chase