【发布时间】:2020-12-07 13:11:35
【问题描述】:
我想使用来自dplyr 的filter 命令以及str_detect。
library(tidyverse)
dt1 <-
tibble(
No = c(1, 2, 3, 4)
, Text = c("I have a pen.", "I have a book.", "I have a pencile.", "I have a pen and a book.")
)
dt1
# A tibble: 4 x 2
No Text
<dbl> <chr>
1 1 I have a pen.
2 2 I have a book.
3 3 I have a pencile.
4 4 I have a pen and a book.
MatchText <- c("Pen", "Book")
dt1 %>%
filter(str_detect(Text, regex(paste0(MatchText, collapse = '|'), ignore_case = TRUE)))
# A tibble: 4 x 2
No Text
<dbl> <chr>
1 1 I have a pen.
2 2 I have a book.
3 3 I have a pencile.
4 4 I have a pen and a book.
所需输出
我希望以更有效的方式进行以下输出(因为在我原来的问题中会有很多 MatchText 的未知元素)。
dt1 %>%
filter(str_detect(Text, regex("Pen", ignore_case = TRUE))) %>%
select(-Text) %>%
mutate(MatchText = "Pen") %>%
bind_rows(
dt1 %>%
filter(str_detect(Text, regex("Book", ignore_case = TRUE))) %>%
select(-Text) %>%
mutate(MatchText = "Book")
)
# A tibble: 5 x 2
No MatchText
<dbl> <chr>
1 1 Pen
2 3 Pen
3 4 Pen
4 2 Book
5 4 Book
更有效地完成上述任务的任何提示。
【问题讨论】:
-
\\b是正则表达式中的单词边界。尝试paste0("\\b", MatchText, "\\b", collapse = '|')将单词边界放在模式的两侧。 -
我只会使用 str_extract
-
感谢@Gregor Thomas 为一个问题提供了很好的解决方案。如果还看第二个问题,将不胜感激。谢谢
-
抱歉,第二个问题是什么?如果是提取,请将我关于单词边界的建议与布鲁诺对
str_extract的建议结合起来,而不是str_detect。也许str_extract_all. -
@GregorThomas:请查看所需的输出。
标签: r dplyr tidyverse stringr tidytable