如果列包含向量中的一个或多个字符串,则创建新列

Create new column if column contains on or more of multiple strings from a vector

我正在尝试对酒店数据进行分类。

我的数据集看起来像下面的数据集,大约是。 400000 行长。

dataset<-data.frame(id=c(1001:1005), Role_title = c("Head Chef","Nurse",
        "Latin America Travel Sales Consultants \xfc\xbe\x8c\xb6\x84\xbcK OTE \xfc\xbe\x8c\xb6\x84\xbcK","Cooks Wanted","Calling all waiters"))

我要查找的词是词干和完整的字符串,向量大约有 100 行长。

terms=c("chef","cook","wait")

我想创建一个新列 'Contains terms',如果向量中的一个或多个字符串与行 'Role_title' 匹配或部分匹配,则将 1 放入 'Contains terms',并且如果没有,则为 0,这样数据集将如下所示。

dataset<-data.frame(id=c(1001:1005), Role_title = c("Head Chef","Nurse",
      "Acting Director Sales","Cooks Wanted","Calling all waiters"),
        Contains_terms=c(1,0,0,1,1))
terms=c("chef","cook","wait")

我们可以使用 stri_detectstringi 到 return 一个逻辑向量,然后 pasteing 'terms' 向量来创建 pattern ,通过用 as.integer

包装将逻辑 vector 转换为二进制
library(stringi)
transform(dataset, Contains_terms = as.integer(stri_detect(toupper(Role_title), 
         regex=paste(toupper(terms), collapse="|"))))
#    id                Role_title Contains_terms
#1 1001                 Head Chef              1
#2 1002                     Nurse              0
#3 1003 Acting     Director Sales              0
#4 1004              Cooks Wanted              1
#5 1005       Calling all waiters              1

grep 的另一个选项(如果 'terms'

中有很多元素
as.integer(Reduce(`|`, lapply(toupper(terms), `grepl`, 
                 x=toupper(dataset$Role_title))))
#[1] 1 0 0 1 1

如果我们想对 "Role_title" 中只有 "ASCII" 个字符的元素进行处理(基于 OP post 中的更新数据集)

i1 <- stri_enc_mark(dataset$Role_title)=="ASCII"
i1
#[1]  TRUE  TRUE FALSE  TRUE  TRUE
dataset$Contains_terms[i1] <-  as.integer(Reduce(`|`, lapply(toupper(terms), `grepl`, 
                 x=toupper(dataset$Role_title[i1]))))
dataset$Contains_terms
#[1]  1  0 NA  1  1