检查字符串是否包含向量 [R] 中的项目以外的任何内容

Check if string contains anything other than items in vector [R]

我有一个包含一列字符串的数据框。我想检查每个字符串中的任何元素是否与一个或多个预定义向量中的任何元素匹配,然后 return 一个新的逻辑列。使用 grepl().

可以轻松完成此操作

但是(这是我需要帮助的部分),我还想检查字符串是否包含任何元素 other 而不是关键字向量中包含的元素。

示例数据:

matchvector1 <- c("Apple","Banana","Orange")
matchvector2 <- c("Strawberry","Kiwi","Grapefruit")

id <- c(1,2,3)
string_column <- c(paste0(c("Apple","Banana"),collapse=", "), paste0(c("Strawberry","Kiwi"), collapse = ", "), paste0(c("Apple","Pineapple"), collapse = ", "))
df <- data.frame(id, string_column)
df$string_column <- as.character(df$string_column)

matches_vector1 <- grepl(paste(matchvector1, collapse = "|"), df$string_column)
matches_vector2 <- grepl(paste(matchvector2, collapse = "|"), df$string_column)

输出应该类似于:

matches_vector1: TRUE FALSE TRUE
matches_vector2: FALSE TRUE FALSE
unmatched_words: FALSE FALSE TRUE

我卡在最后一部分了。有没有一种简单的方法可以使用 grepl() (或其他函数)匹配关键字列表中 之外的任何内容?我怀疑它会涉及以某种方式使用负面环视,但现有的几个线程似乎没有回答我的问题。

一个选项是将 'string_column' 拆分为 separate_rows,按 'id' 分组,检查是否没有来自 'string_column' 的 any 个元素 %in% 串联向量

library(dplyr)
library(tidyr)
df %>%
   separate_rows(string_column) %>%
   group_by(id) %>% 
   summarise(unmatched = any(!string_column %in% c(matchvector1, matchvector2)) )
# A tibble: 3 x 2
#     id unmatched
#* <dbl> <lgl>    
#1     1 FALSE    
#2     2 FALSE    
#3     3 TRUE     

或在base R

lengths(sapply(strsplit(df$string_column, ",\s*"), 
      setdiff, c(matchvector1, matchvector2))) > 0
#[1] FALSE FALSE  TRUE