web-dev-qa-db-ja.com

正規表現(RegEx)およびdplyr :: filter()

次のようなシンプルなデータフレームがあります。

_x <- c("aa", "aa", "aa", "bb", "cc", "cc", "cc")
y <- c(101, 102, 113, 201, 202, 344, 407)
df = data.frame(x, y)    

    x   y
1   aa  101
2   aa  102
3   aa  113
4   bb  201
5   cc  202
6   cc  344
7   cc  407
_

Dplyr :: filter()とRegExを使用して、_1_で始まるすべてのy観測をフィルターで除外したい

コードは次のようになると思います:

_df %>%
  filter(y != grep("^1")) 
_

しかし、私はError in grep("^1") : argument "x" is missing, with no defaultを取得しています

22
emehex

greplfilterのドキュメントを再確認する必要があります。

grep/greplの場合は、チェックインするベクトル(この場合はy)も指定する必要があり、filterは論理ベクトルを取ります(つまり、 grepl)。 (grepからの)インデックスベクトルを提供する場合は、代わりにsliceを使用できます。

df %>% filter(!grepl("^1", y))

または、grepから派生したインデックスを使用:

df %>% slice(grep("^1", y, invert = TRUE))

ただし、最初の文字だけに関心があるため、substrを使用することもできます。

df %>% filter(substr(y, 1, 1) != 1)
40
talat

dplyrstringrを組み合わせて(tidyverse内にとどまる)、次のようにできます。

df %>% filter(!str_detect(y, "^1"))

これは、str_detectは論理ベクトルを返します。

14
Omar