Teilstring stimmt mit zwei Spalten überein R

Ich habe versucht, zwei Spalteninhalte auf der Grundlage einer Liste regulärer Ausdrücke, die für beide Spalten gelten, teilweise abzugleichen:

dats<-data.frame(ID=c(1:3),species=c("dog","cat","rabbit"),
species.descriptor=c("all animal dog","all animal cat","rabbit exotic"),product=c(1,2,3),
product.authorise=c("all animal dog cat rabbit","cat horse pig","dog cat"))

it dem Ziel, dies zu erreiche

goal<-data.frame(ID=c(1:3),species=c("dog","cat","rabbit"),
            species.descriptor=c("all animal dog","all animal cat","rabbit exotic"),
            product=c(1,2,3),product.authorise=c("all animal dog cat rabbit","cat horse pig",
            "dog cat"), authorised=c("TRUE","TRUE","FALSE"))    

Um dies weiter zu erläutern: Wenn in beiden Spalten an irgendeiner Stelle "Hund" erscheint, wird dies in "$ match" als "TRUE" gewertet. Dies gilt für jeden einzelnen Spezies-Deskriptor entweder FALSE oder ein na wäre in Ordnung.

So weit bin ich gekommen:

library(stringr)
patts<-c("dog","cat","all animal")
reg.patts<-paste(patts,collapse="|")
dats$matched<-ifelse((str_extract(dats$species.descriptor,reg.patts) == str_extract(dats$product.authorise,reg.patts)),"TRUE","FALSE")
dats
  ID species species.descriptor product         product.authorise matched
   1     dog     all animal dog       1 all animal dog cat rabbit    TRUE
   2     cat     all animal cat       2             cat horse pig   FALSE
   3  rabbit      rabbit exotic       3                   dog cat    <NA>

Wie Sie sehen können, werden die erste und die letzte Zeile korrekt identifiziert, da in beiden Zeichenfolgen "all animal" an erster Stelle steht und in der letzten Zeile überhaupt keine Übereinstimmung vorliegt. Es scheint jedoch zu kämpfen (wie in der zweiten Reihe), wenn die Reg-Exp nicht zuerst in der Zeichenfolge angezeigt wird. Ich habe str_extract_all ausprobiert, aber bisher nur Fehlermeldungen ausgegeben. Ich habe mich gefragt, ob jemand helfen kann, bitte?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage