首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tidyverse:用str_detect过滤

tidyverse:用str_detect过滤
EN

Stack Overflow用户
提问于 2020-12-07 13:11:35
回答 2查看 914关注 0票数 0

我想使用来自dplyrdplyr命令和str_detect

代码语言:javascript
复制
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元素)。

代码语言:javascript
复制
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 

任何更有效地完成上述任务的提示。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-07 14:18:44

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2020-12-07 14:18:29

str_extract_all()提供多个匹配项,您可以将它们重新嵌套到不同的行中,以获得所需的输出。如果需要,仍然可以使用paste+collapse方法从向量生成模式。

代码语言:javascript
复制
library(stringr)
dt1 %>% 
  mutate(match = str_extract_all(tolower(Text), "pen|book")) %>% 
  unnest(match) %>% 
  select(-Text)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65182347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档