如果列包含向量中的一个或多个字符串,则创建新列
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_detect
从 stringi
到 return 一个逻辑向量,然后 paste
ing '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
我正在尝试对酒店数据进行分类。
我的数据集看起来像下面的数据集,大约是。 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_detect
从 stringi
到 return 一个逻辑向量,然后 paste
ing '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