如何从字符串中过滤 "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
的结果是用 !
运算符反转的。
我正在尝试使用项目描述从 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
的结果是用 !
运算符反转的。