我想使用来自dplyr的dplyr命令和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 任何更有效地完成上述任务的提示。
发布于 2020-12-07 14:18:44
library(tidyverse)
dt1 %>%
mutate(
result = str_extract_all(Text, regex(paste0("\\b", MatchText, "\\b", collapse = '|'),ignore_case = TRUE))
) %>%
unnest(result) %>%
select(-Text)
# # A tibble: 4 x 2
# No result
# <dbl> <chr>
# 1 1 pen
# 2 2 book
# 3 4 pen
# 4 4 book 我不知道你问题中的“整句话”在编辑后发生了什么--我留下了单词边界来匹配整个单词,但是因为“钢笔”并不是“铅笔”的全部单词匹配,所以我的结果与你的结果不匹配。如果想要部分单词匹配,就去掉\\b。
发布于 2020-12-07 14:18:29
str_extract_all()提供多个匹配项,您可以将它们重新嵌套到不同的行中,以获得所需的输出。如果需要,仍然可以使用paste+collapse方法从向量生成模式。
library(stringr)
dt1 %>%
mutate(match = str_extract_all(tolower(Text), "pen|book")) %>%
unnest(match) %>%
select(-Text)https://stackoverflow.com/questions/65182347
复制相似问题