如何从字符串中过滤 "CUSTOM" 而不是 R 中的 "CUSTOMER"?格雷普?

How do I filter "CUSTOM" out of a string but not "CUSTOMER" in R? Grepl?

我正在尝试使用项目描述从 R 中的数据框中过滤掉自定义项目。我想删除描述中带有 "CUSTOM" 的所有项目,但我需要保留描述中带有 "CUSTOMER" 的项目。我尝试使用 grepl 函数但无济于事。我有 800,000 多行数据,所以快速处理会很有帮助。这只是众多过滤器中的一个,所以我将 dplyr 和管道运算符与我的其他过滤器一起使用。

通用代码:

> items <- c("A", "B", "C")
> desc <- c("CUSTOM STAMP", "CUSTOMER 4X6 IN STAMP", "4X6 GENERIC STAMP")
> df <- data.frame(Items = items, Item_Desc = desc)
> df
  Items               Item_Desc
1     A            CUSTOM STAMP
2     B   CUSTOMER 4X6 IN STAMP
3     C       4X6 GENERIC STAMP

我试过这样的事情:

library(dplyr)
df <- df %>% 
        filter(!grepl("CUSTOM", Item_Desc, fixed = TRUE))

但显然,结果是:

> df
  Items         Item_Desc
1     C 4X6 GENERIC STAMP

而期望的结果是:

> df
  Items               Item_Desc
1     B   CUSTOMER 4X6 IN STAMP
2     C       4X6 GENERIC STAMP

谢谢!

grepl("CUSTOM(?!ER)", desc, perl = T) 匹配 CUSTOM 但不匹配 CUSTOMER。

如果在 CUSTOM 之后添加 space,只要 CUSTOM 本身不是最后一个词,它就可以工作。

df[!grepl("CUSTOM ", df$Item_Desc),]
#  Items             Item_Desc
#2     B CUSTOMER 4X6 IN STAMP
#3     C     4X6 GENERIC STAMP

或基于strsplit

df[sapply(strsplit(as.character(df$Item_Desc), " "),
               function(x) all(toupper(x) != "CUSTOM")),]
#  Items             Item_Desc
#2     B CUSTOMER 4X6 IN STAMP
#3     C     4X6 GENERIC STAMP

您需要在此处使用利用单词边界的正则表达式,"\bCUSTOM\b"

要使其正常工作,您需要删除 fixed=TRUE,因为此参数会使引擎将模式视为文字字符串,而不是模式。

使用

df <- df %>% 
        filter(!grepl("\bCUSTOM\b", Item_Desc))    

参见what the pattern matches。只有不匹配的项才会保留在 df 中,因为 grepl 的结果是用 ! 运算符反转的。