正则表达式 (RegEx) 和 dplyr::filter()
Regular expressions (RegEx) and 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
您需要仔细检查 grepl
和 filter
的文档。
对于 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)
结合使用 dplyr
和 stringr
(保持在 tidyverse 内),您可以:
df %>% filter(!str_detect(y, "^1"))
这是可行的,因为 str_detect
returns 一个逻辑向量。
我有一个简单的数据框,如下所示:
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
您需要仔细检查 grepl
和 filter
的文档。
对于 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)
结合使用 dplyr
和 stringr
(保持在 tidyverse 内),您可以:
df %>% filter(!str_detect(y, "^1"))
这是可行的,因为 str_detect
returns 一个逻辑向量。