我有一个关于grep
的快速问题,我似乎无法解决。假设我有一个名单列表:brand<-c(Brand1, Brand2, Brand3, Brand4)
。我想确定这些名称是否出现在另一个字符串变量(var1)中,然后创建一个逻辑变量(T / F)。
ID var1 var_filter
1 Text about Brand 1 TRUE
1 Text FALSE
1 Text about Brand 2 TRUE
1 Text about Brand 3 TRUE
1 Text FALSE
1 Text about Brand 1 TRUE
我该怎么做呢?我的猜测是grep
,但是当我有一个完整的可能字符串列表而不是单个字符串时,我不知道该怎么做。
答案 0 :(得分:1)
我使用sapply
,grepl
和any
的组合来完成任务。我们的想法是使用grepl来查找文本中哪些元素包含任何给定的品牌。我使用sapply为每个品牌做这些。然后,我们使用apply
和any
来确定文本中包含任何品牌的值。
brands <- c("CatJuice", "robopuppy", "DasonCo")
text <- c("nononono", "That CatJuice is great", "blargcats", "I gave the robopuppy some CatJuice")
id <- sapply(brands, grepl, text, fixed = TRUE)
# if case sensitivity is an issue
#id <- sapply(tolower(brands), grepl, tolower(text), fixed = TRUE)
apply(id, 1, any)
这是区分大小写的,如果这是一个问题,您可以轻松使用tolower
将所有内容转换为小写。
答案 1 :(得分:1)
Brand1 <- "Brand 1"; Brand2 <- "Brand 2"; Brand3 <- "Brand 3"; Brand4 <- "Brand 3"
brand <- c(Brand1, Brand2, Brand3, Brand4)
dfrm$var_filter <- grepl( paste(brand, collapse="|"), dfrm$var1)
答案 2 :(得分:0)
您可以在模式中使用|
。像这样:
dados <- read.table(text='ID var1
1 TextaboutBrand1
1 Text
1 TextaboutBrand2
1 TextaboutBrand3
1 Text
1 TextaboutBrand1', header=TRUE, sep=' ')
grep1 <- function(x, brand) { length(grep(paste0(brand,collapse='|'), x[2])) == 1 }
apply(dados,1,grep1,brand)
或使用mapply()
...