正则表达式(RegEx)和dplyr :: filter()

问题描述 投票:13回答:2

我有一个简单的数据框,如下所示:

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过滤掉所有以y开头的1观察

我想象代码看起来像这样:

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

但我得到了一个Error in grep("^1") : argument "x" is missing, with no default

regex r dplyr
2个回答
30
投票

您需要仔细检查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)

6
投票

通过dplyrand stringr(保持在整齐的范围内)的组合,您可以:

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

这是有效的,因为str_detect返回逻辑向量。

© www.soinside.com 2019 - 2024. All rights reserved.