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

时间:2016-05-01 05:49:46

标签: r string text dplyr text-mining

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

我的数据集看起来像下面的数据集,大约是。 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")

我想创建一个新列'包含术语',如果向量中的一个或多个字符串与Row'Role_title'匹配或部分匹配,则将1放入'包含术语',如果不匹配则为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")

1 个答案:

答案 0 :(得分:1)

我们可以使用stri_detect中的stringi返回paste'词'向量后的逻辑向量来创建pattern,转换逻辑vector通过用as.integer

包装来二进制
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的其他选项(如果“条款”中有许多元素

as.integer(Reduce(`|`, lapply(toupper(terms), `grepl`, 
                 x=toupper(dataset$Role_title))))
#[1] 1 0 0 1 1

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

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