Как проверить, соответствует ли каждое значение вектора какому-либо значению вектора строк? - PullRequest
0 голосов
/ 30 июня 2018

Я хотел бы использовать str_detect для проверки каждого значения из fruit, есть ли совпадение в векторе strings.

fruit <- c("apple", "banana", "pear", "pinapple")
  strings <- c("apple", "app", "pear", "apple", "app", "pear", "apple", "app", "pear")

Это делает работу:

> map_chr(fruit, ~any(str_detect(.x, strings)))
[1] "TRUE"  "FALSE" "TRUE"  "TRUE" 

Но мне было интересно, есть ли способ написать это в более сжатой форме, используя векторизацию str_detect. Что-то вроде:

  str_detect(fruit, strings)  

[1]  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE
Warning message:
In stri_detect_regex(string, pattern, opts_regex = opts(pattern)) :
  longer object length is not a multiple of shorter object length

Но я ищу вывод длины length(fruit) вместо 9.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

У вас есть много вариантов для достижения правильного решения.

Опция № 1: Использование оператора %in%

fruit %in% strings

#[1]  TRUE FALSE  TRUE FALSE

Опция № 2: Использование str_detect

library(stringr)

# Make sure to use \b around each word to avoid partial matching.
str_detect(fruit, pattern = paste("\\b",strings,"\\b", sep="", collapse = "|"))
#[1]  TRUE FALSE  TRUE FALSE
0 голосов
/ 30 июня 2018

Банан и ананасы должны давать вам ложь, поскольку их нет в строках:

str_detect(fruit,str_c("\\b(",strings,")\\b",collapse = "|"))

[1]  TRUE FALSE  TRUE FALSE
...