创建一个逻辑变量,用于标识字符串变量是否出现在另一个字符串中

时间:2013-04-02 13:59:26

标签: r

我有一个关于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,但是当我有一个完整的可能字符串列表而不是单个字符串时,我不知道该怎么做。

3 个答案:

答案 0 :(得分:1)

我使用sapplygreplany的组合来完成任务。我们的想法是使用grepl来查找文本中哪些元素包含任何给定的品牌。我使用sapply为每个品牌做这些。然后,我们使用applyany来确定文本中包含任何品牌的值。

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() ...