2016-05-01 19 views
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") 

我想創建一個新的列「包含術語」其中放置一個1,如果從載體中的一個或多個串匹配或部分匹配的行「Role_title」變成「包含術語」和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

我們可以使用從stringistri_detectpaste荷蘭國際集團的「條件」矢量後返回一個邏輯向量創建pattern,用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 

包裝轉換的邏輯 vector爲二進制

或另一個選項grep(同樣如果「條款中有很多元素」

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

如果我們想爲只有「ASCII」字符「Role_title」元素(基於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 
+0

另外一個問題是如何確保所有Role_title字詞都是字符(例如「助理Caf \ xe9經理Rose Bay NSW」)只是編輯了代碼來反映這一點。 – monkeyshines

+0

已嘗試以下操作,但未刪除不需要的元素:數據集$ Role_title <-gsub('[[:digit:]]',「」,dataset $ Role_title) dataset $ Role_title <-gsub(「[[:punct :]]「,」「,dataset $ Role_title) – monkeyshines

+0

@MonikaSarder這個更新給了我一些像'拉丁美洲旅遊銷售顧問'這樣的東西。'KK OTEü¾Œ'」¼K'。你可以用例 – akrun

相關問題