Определить часть строки в R (не точное совпадение) - PullRequest
2 голосов
/ 27 октября 2019

Рассмотрим следующий набор данных:

a <- c("my house", "green", "the cat is", "a girl")
b <- c("my beautiful house is cool", "the apple is green", "I m looking at the cat that is sleeping", "a boy")
c <- c("T", "T", "T", "F")
df <- data.frame(string1=a, string2=b, returns=c)

Я пытаюсь обнаружить строку1 в строке2, НО моя цель - не только определить точное соответствие. Я ищу способ обнаружить присутствие слов string1 в string2, независимо от того, появляются ли слова порядка. Например, строка «мой красивый дом крут» должна возвращать значение «ИСТИНА» при поиске «мой дом».

Я попытался проиллюстрировать ожидаемое поведение сценария в столбце «Возврат» вышеПример набора данных.

Я пробовал функции grepl () и str_detect (), но он работает только с точным соответствием. Можете ли вы помочь? Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

Хитрость здесь заключается в том, чтобы не использовать str_detect как есть, а сначала разбить search_words на отдельные слова. Это сделано в strsplit() ниже. Затем мы передаем это в str_detect, чтобы проверить, совпадают ли все слова.

library(stringr)
search_words <- c("my house", "green", "the cat is", "a girl")
words <- c("my beautiful house is cool", "the apple is green", "I m looking at the cat that is sleeping", "a boy")

patterns <- strsplit(search_words," ")

mapply(function(word,string) all(str_detect(word,string)),words,patterns)

1 голос
/ 27 октября 2019

Один base R параметр без участия разделения может быть:

n_words <- lengths(regmatches(df[, 1], gregexpr(" ", df[, 1], fixed = TRUE))) + 1

n_matches <- mapply(FUN = function(x, y) lengths(regmatches(x, gregexpr(y, x))), 
                    df[, 2],
                    gsub(" ", "|", df[, 1], fixed = TRUE),
                    USE.NAMES = FALSE)

n_matches == n_words

[1]  TRUE  TRUE  TRUE FALSE

Однако он предполагает, что в строке string1

есть хотя бы одно слово в строке.
...