【问题标题】:Create new column if column contains on or more of multiple strings from a vector如果列包含一个或多个来自向量的多个字符串,则创建新列
【发布时间】:2016-05-01 05:49:45
【问题描述】:

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

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

我想创建一个新列“包含术语”,如果向量中的一个或多个字符串匹配或部分匹配“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")

【问题讨论】:

    标签: r string text dplyr text-mining


    【解决方案1】:

    我们可以使用stringi中的stri_detectpaste'terms'向量之后返回一个逻辑向量来创建pattern,通过用as.integer包装将逻辑vector转换为二进制/p>

    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 帖子中更新的数据集)

    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
    

    【讨论】:

    • 另一个问题是如何确保所有 Role_title 术语都是字符(例如“Assistant Caf\xe9 Manager Rose Bay NSW”)刚刚编辑了代码以反映这一点。
    • 已尝试以下方法,但未删除不需要的元素: dataset$Role_title
    • @MonikaSarder 更新给了我类似Latin America Travel Sales Consultants ü¾Œ¶„¼K OTE ü¾Œ¶„¼K 的信息。您可以使用示例的 dput 进行更新吗
    • 我能做些什么来删除所有这些行中带有“\”元素的行。只有少数几个?
    • 新代码有效。下次会尝试消除那些在预处理中的。
    猜你喜欢
    • 2023-02-02
    • 1970-01-01
    • 2023-02-24
    • 2018-12-02
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2019-03-24
    相关资源
    最近更新 更多