我正在尝试对酒店数据进行分类。
我的数据集看起来像下面的数据集,大约是。 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")
答案 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