Функция R для нахождения как минимум 2 слов, совпадающих между 2 строками (применяется к 2 векторам строк)? - PullRequest
0 голосов
/ 24 января 2019

У меня есть 2 набора строк. Char и Char2 для этого примера. Я пытаюсь определить, содержит ли Char хотя бы 2 слова из Char2 (любые два слова могут совпадать). Я еще не дошел до части "по крайней мере, 2 слова", но я должен сначала выяснить соответствие любого слова в каждой строке. Любая помощь будет принята с благодарностью.

Я пробовал использовать пакет stringr несколькими способами. Пожалуйста, смотрите ниже. Я попытался использовать аналогичные решения, на которые Роберт ответил в этом вопросе: Обнаружение нескольких строк с помощью dplyr и stringr

shopping_list <- as.data.frame(c("good apples", "bag of apples", "bag of sugar", "milk x2"))
colnames(shopping_list) <- "Char"

shopping_list2 <- as.data.frame(c("good pears", "bag of sugar", "bag of flour", "sour milk x2"))
colnames(shopping_list2) <- "Char2"

shop = cbind(shopping_list , shopping_list2)
shop$Char = as.character(shop$Char)
shop$Char2 = as.character(shop$Char2)


# First attempt
sapply(shop$Char, function(x) any(sapply(shop$Char2, str_detect, string = x)))

# Second attempt
str_detect(shop$Char, paste(shop$Char2, collapse = '|'))

Я получаю эти результаты:

sapply(shop$Char, function(x) any(sapply(shop$Char2, str_detect, string = x)))
  good apples bag of apples  bag of sugar       milk x2 
        FALSE         FALSE          TRUE         FALSE 


str_detect(shop$Char, paste(shop$Char2, collapse = '|'))
FALSE FALSE  TRUE FALSE

Однако я ищу эти результаты:

ЛОЖНО ИСТИНА ИСТИНА

1) ЛОЖЬ, потому что соответствует только 1 слову 2) ИСТИНА потому что "мешок" в обоих 3) ИСТИНА, потому что "мешок" в обоих 4) ИСТИНА, потому что "молоко х2" в обоих

1 Ответ

0 голосов
/ 24 января 2019

Вот функция, которая может помочь

match_test <- function (string1, string2) {
  words1 <- unlist(strsplit(string1, ' '))
  words2 <- unlist(strsplit(string2, ' '))
  common_words <- intersect(words1, words2)
  length(common_words) > 1
}

Вот пример

string1 <- c("good apples" , "bag of apples", "bag of sugar", "milk x2")
string2 <- c("good pears" , "bag of sugar", "bag of flour", "sour milk x2")
vapply(seq_along(string1), function (k) match_test(string1[k], string2[k]), logical(1))
# [1] FALSE  TRUE  TRUE  TRUE
...