我检查了数据帧的品牌"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"