簡體   English   中英

R中兩列之間部分匹配的標志

[英]Flag for partial match between 2 columns in R

我有一個數據框,需要創建一個標志來指示其中兩列之間存在部分匹配的實例,這里是代碼和一些虛擬數據:

doc_id <- c("doc1","doc1","doc2","doc3","doc3","doc4","doc4")
word <- c("apple","apples","chicken","banana","bananas","veggie","veggies")
text <- c("yesterday I ate apples", "yesterday I ate apples", "yesterday I ate chicken", "yesterday I ate bananas", "yesterday I ate bananas", "yesterday I ate veggies", "yesterday I ate veggies") 
mydata <- data.frame(doc_id,word,text,stringsAsFactors = FALSE)

預期結果是相同的數據框,帶有一個附加列,顯示單詞和文本之間的匹配是否為部分匹配

doc_id <- c("doc1","doc1","doc2","doc3","doc3","doc4","doc4")
word <- c("apple","apples","chicken","banana","bananas","veggie","soup")
text <- c("yesterday I ate apples", "yesterday I ate apples", "yesterday I ate chicken", "yesterday I ate bananas", "yesterday I ate bananas", "yesterday I ate veggies", "yesterday I ate soup") 
partial_match <- c("1","0","0","1","0","1","0")
mydata2 <- data.frame(doc_id,word,text,partial_match,stringsAsFactors = FALSE)

我試過

str_detect(mydata$word, mydata$text)

以及使用諸如charmatch、pmatch、grep 和grepl 之類的函數但沒有成功的類似事物。

真實數據包含數千條記錄,因此解決方案應該可以擴展。

謝謝。

經過長時間的嘗試,我對字符串操作有了更多了解並掌握了它。 可能不是最有效的方式,但它奏效了。

OBS:我用“¹”、“²”和“³”標記了評論,以便我稍后解釋。

parcial.m = numeric() # Create an empty vector

for(i in 1:nrow(mydata2)){
  pattern = paste("([^\n]*)(",mydata2$word[i],")([^\n]*)",sep="")
  # ¹

  split = unlist(strsplit(mydata2$text[i], "[ [:punct:]]"))
  # Split the text by punctuation and spaces, i.e. by words

  word = grep(mydata2$word[i], split, value=TRUE)
  # Select only the 'original' word
  
  if(length(grep(mydata2$word[i], word))==0) {parcial.m[i]=0}
  # ²

  else {parcial.m[i] = !((gsub(pattern, "\\1" , word)=="") & (gsub(pattern, "\\3" , word)==""))}}
  # ³

¹:模式是:一組(由(...)標記)0 或更多(因此是* )的除換行符以外的任何字符(因此^\\n\\n是新行, ^是除了it),然后是一個包含搜索詞的組,以及與第一個相同的第三組。

²:如果根本沒有匹配,我們沒有得到部分匹配,所以我們想要一個值 0。我們通過使用grep(mydata2$word[i], word)將返回一個數字來選擇這些情況不匹配時長度為 0。

³: "\\\\1""\\\\3"選擇模式的第 1 和第 3 組。 如果它是一個完美的匹配,那么在我們“帶走”搜索到的詞(第 2 組)之后,不會有任何“剩余word (我稱之為“原始詞”),因此第 1 組和第 3 組將為空(即 = "" )。 那行代碼正在測試兩個組是否同時為空(完全匹配),並否定它(因此是!)。 由於我們已經使用 if 語句將不匹配標記為 0,因此剩下的是部分匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM