0

我有一个快速的问题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,但是当我有一个完整的可能字符串列表而不是单个字符串时,我不确定该怎么做。

4

3 回答 3

1

我使用 、 和 的组合sapplygrepl完成any任务。这个想法是使用 grepl 来查找文本中的哪些元素包含任何给定的品牌。我使用 sapply 为每个品牌做这些。然后我们使用applywithany来识别文本中的哪些值包含任何品牌。

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地将所有内容转换为小写。

于 2013-04-02T14:06:13.040 回答
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)
于 2013-04-02T16:56:19.187 回答
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()...

于 2013-04-02T14:09:55.393 回答