40

dplyrと を使用して、大規模なデータセットからいくつかの観測をフィルタリングする方法を考え出そうとしていますgreplgrepl他のソリューションがより最適である場合、私は に夢中ではありません。

このサンプル 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' で終わるだけでなく、内部に '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できれば 室内でやりたいです。

4

1 に答える 1

50

私はあなたの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 演算子です。greplwithの結果を否定している!ので、正規表現の内容と一致しない文字列を見つけています。

于 2014-09-23T16:01:51.293 に答える