【问题标题】:How to add a logical AND to a combination of logical ORs using filter and str_detect?如何使用 filter 和 str_detect 将逻​​辑 AND 添加到逻辑 OR 的组合中?
【发布时间】:2018-09-13 09:27:40
【问题描述】:

我有以下示例数据框“df”,其中包含文本的变量“Text”:

df:
    Text
1   I like blue shoes.
2   Black is great!
3   Pink and grey books.
4   I don't like grey trousers.
5   Yellow is my favorite colour
6   No more green!
7   Cars are red.
8   I have a pink bike

我使用以下代码过滤每个包含至少一个列出的单词的案例,效果非常好:

library(tidyverse)
library(igraph)
library(stringi)
library(stringr)

filter <- c("blue","green","yellow","red")
df2 <-
  df %>%
  filter(str_detect(tolower(df$Text), paste(filter, collapse = "|")))

df2:
    Text
1   I like blue shoes.
5   Yellow is my favorite colour
6   No mor green!
7   Cars are red.

作为附加条件,我现在想添加“粉红色”和“灰色”的组合,过滤上面列出的至少一个词或组合。我想要的数据框如下所示:

df2:
    Text
1   I like blue shoes.
3   Pink and grey books.
5   Yellow is my favorite colour
6   No mor green!
7   Cars are red.

你知道我怎么去那里吗? 提前致谢!

【问题讨论】:

  • 请在您的问题中提供最少的、可重复的、有代表性的示例。对数据使用 dput() 并指定所有带有库的非基础包 ...

标签: r dplyr stringr


【解决方案1】:

您可以使用&amp; 运算符来组合filter 运算(还有| OR 运算符)。

> f1
[1] "blue"   "green"  "yellow" "red"   

> f2
[1] "pink" "grey"

> df
# A tibble: 4 x 2
  Text1       Text2
  <chr>       <chr>
1 Yellow      This 
2 red         That 
3 Purple grey The  
4 green pink  other

> filter(df,  str_detect(Text1, paste0(f1, collapse = "|")))

   # A tibble: 2 x 2
   Text1      Text2
   <chr>      <chr>
  1 red        That 
  2 green pink other

> filter(df,  
str_detect(Text1, paste0(f1, collapse = "|")) & 
str_detect(Text1, paste0(f2, collapse = "|")))

  # A tibble: 1 x 2
  Text1      Text2
  <chr>      <chr>
1 green pink other

注意第二个需要两个操作。

编辑处理评论

> filter(df,  
    str_detect(Text1, paste0(f1, collapse = "|")) | 
    (str_detect(Text1, "pink") & str_detect(Text1, "grey")))

您仍然可以使用 & 或 |运算符和括号一起得到你想要的逻辑组合。

【讨论】:

  • 感谢您的回复!但是,如果有意义的话,我需要的不是“f1 AND f2”,而是更多“蓝色或绿色或黄色或红色或(粉色和灰色)”。我在原始问题中添加了对我的问题的更详细描述。
猜你喜欢
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
相关资源
最近更新 更多