微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R中2列之间部分匹配的标志

如何解决R中2列之间部分匹配的标志

我有一个数据框,需要创建一个标志来指示实例,其中实例中的两列之间存在部分匹配,这是代码和一些伪数据:

doc_id <- c("doc1","doc1","doc2","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 veggies","yesterday I ate veggies") 
mydata <- data.frame(doc_id,word,text,stringsAsFactors = FALSE)

预期结果是与同一数据框相同,并带有一列,用于显示单词和文本之间的匹配是否为部分匹配

doc_id <- c("doc1","soup")
text <- c("yesterday I ate apples","yesterday I ate soup") 
partial_match <- c("1","0","1","0")
mydata2 <- data.frame(doc_id,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)==""))}}
  # ³

¹:模式是:除换行(因此(...),{ {1}}是换行符,*是除换行符之外的所有字符),然后是带有搜索词的组,第三个等于第一个。

²:如果根本没有匹配项,那么我们就没有部分匹配项,因此我们希望其值为0。我们使用^\n将返回长度为0的数字这一事实来选择这些情况没有匹配的时候。

³:\n^选择模式的第1组和第3组。如果这是一个完美的匹配,那么在我们“离开”搜索到的单词(第2组)之后,grep(mydata2$word[i],word)(我称为“原始单词”)将不会有任何“剩余值”,因此第1和第3组将是空(即= "\\1")。该行代码测试两个组是否同时为空(完全匹配),并将其取反(因此为!)。正如我们已经使用if语句将不匹配项标记为0一样,剩下的就是部分匹配项。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。