有没有一种方法可以使用R中的grepl函数来显示特定案例的匹配元素



我检查了数据帧的品牌"df1";

brands
1 Nike   
2 Adidas  
3 D&G

将在数据帧的下一列的元素中找到;df2";

statements 
1 I love Nike   
2 I don't like Adidas   
3 I hate Puma  

为此,我使用代码:

subset_df2 <- df2[grepl(paste(df1$brands, collapse="|"), ignore.case=TRUE, df2$statements), ] 

代码有效,我得到了df2的一个子集,其中只包含具有所需品牌的行:

statements*
1 I love Nike   
2 I don't like Adidas

是否还有一种方法可以显示df2$语句中单元格的哪个元素与df1$品牌完全匹配?例如,像[耐克,阿迪达斯]这样的矢量。所以,我只想把耐克和阿迪达斯的元素作为我的输出,而不是整个声明。

非常感谢!

brands <- c("nike", "adidas", "d&g")  # lower-case here
text <- c("I love Nike", "I love Adidas")
ptns <- paste(brands, collapse = "|")
ptns
# [1] "nike|adidas|d&g"
text2 <- text[NA]
text2[grepl(ptns, text, ignore.case=TRUE)] <- gsub(paste0(".*(", ptns, ").*"), "\1", text, ignore.case = TRUE)
text2
# [1] "Nike"   "Adidas"

text[NA]的预分配是因为如果找不到模式,gsub将不进行任何更改。我用的是text[NA],但我们也可以用rep(NA_character_, length(text)),效果是一样的。

如果每个text需要多个匹配,那么也许

brands <- c("Nike", "Adidas", "d&g")
text <- c("I love nike", "I love Adidas and Nike")
ptns <- paste(brands, collapse = "|") 
gre <- gregexpr(ptns, text, ignore.case = TRUE)
sapply(regmatches(text, gre), paste, collapse = ";")
# [1] "nike"        "Adidas;Nike"

最新更新