2016-09-11 12 views
2

Выборочные данныеR - Найти все векторные элементы, которые содержат все строки/шаблоны - str_detect Grep

files.in.path = c("a.4.0. name 2015 - NY.RDS", 
        "b.4.0. name 2016 - CA.RDS", 
        "c.4.0. name 2015 - PA.RDS") 
strings.to.find = c("4.0", "PA") 

Я хочу, чтобы логический вектор, который содержит все элементы, которые содержат все strings.to.find. Результат хотел:

FALSE FALSE TRUE 

Этот код будет найти элементы, которые содержат какой-либо один из strings.to.find, т.е. использует оператор ИЛИ

str_detect(files.in.path, str_c(strings.to.find, collapse="|")) # OR operator 
TRUE TRUE TRUE 

Этот код пытается использовать оператор И, но не работает.

str_detect(files.in.path, str_c(strings.to.find, collapse="&")) # AND operator 
FALSE FALSE FALSE 

Это работает в нескольких строках, и я могу написать for цикл, который будет генерировать все отдельные линии для случаев с большим числом strings.to.find

det.1 = str_detect(files.in.path,  "4.0" ) 
det.2 = str_detect(files.in.path,  "PA" ) 
det.all = det.1 & det.2 
FALSE FALSE TRUE 

Но есть лучший способ, который не связаны с использованием регулярного выражения, которые зависят от положения или порядка strings.to.find.

ответ

2

Поиска в Сети для любого «г регулярного выражения„и“operaror» или «регулярного выражения„и оператора“» приводит к R grep: is there an AND operator? и Regular Expressions: Is there an AND operator? соответственно.

Так, чтобы соответствовать обе модели конкатенации строк вместе

str <- paste0("(?=.*", strings.to.find,")", collapse="") 
grepl(str, files.in.path, perl=TRUE) 

Как Jota упоминалось в комментарии, сопоставляя «4,0» это будет также соответствовать другим жала как период метасимволом. Одно исправление заключается в том, чтобы избежать периода в вашей строке шаблонов, т.е. strings.to.find = c("PA", "4\\.0")

+0

@Jota; хорошая точка зрения. Например, 'grepl (" 4.0 "," 4 0 ")', поэтому, возможно, мы сможем избежать этого 'grepl (" 4 \\. 0 "," 4 0 ")' – user2957945

2

Это не для поднятия тяжестей, но str_detect в векторном над как строками и структурами, так что вы можете комбинировать его с outer функции, чтобы получить что-то близкое:

library(stringr) 
outer(files.in.path, strings.to.find, str_detect) 

#  [,1] [,2] 
#[1,] TRUE FALSE 
#[2,] TRUE FALSE 
#[3,] TRUE TRUE 

Чтобы проверить, если все модели существуют в виде строки , applyall логический оператор для каждой строки результирующей матрицы:

apply(outer(files.in.path, strings.to.find, str_detect), 1, all) 

#[1] FALSE FALSE TRUE 

Или согласно @Jota комментировал, stri_detect_fixed будет безопаснее использовать здесь, если шаблон вы Лоо король должно быть точно подобрано:

library(stringi) 
apply(outer(files.in.path, strings.to.find, stri_detect_fixed), 1, all) 
# [1] FALSE FALSE TRUE 

 Смежные вопросы

  • Нет связанных вопросов^_^