Выяснение, какой шаблон был сопоставлен при использовании нескольких шаблонов - PullRequest
1 голос
/ 09 июня 2019

Я ищу, чтобы узнать, какой шаблон соответствует в списке имен файлов.Я могу выяснить, было ли найдено совпадение, но не определить, какой шаблон был найден.

  local_pattern <- data.frame(
    condition = c("umhfl","dmhfl", "umhfr", "dmhfr", "shfr", "vshfr", "vshfl"),
    filename = c("*Upward motion*HF*Left*.csv", "*Downward motion*HF*Left*.csv", "*UHFR*.csv", "*DHFR*.csv", "*SHFR*.csv", "*VSHFR*.csv", "*VSHFL*.csv")
  )

## matching a sample file name
pattern_matched <- grep(paste(glob2rx(local_pattern[,2]), collapse = "|"), "./csv files/DHFR 2019-04-09 04.59 PM_001.csv", value = F)

То, что я хотел бы видеть, - это сопоставленный шаблон, а не просто ИСТИНА, что совпадение было найдено.

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Мы можем использовать str_detect из stringr, который векторизован для string и pattern:

library(stringr)
str_detect("./csv files/DHFR 2019-04-09 04.59 PM_001.csv",
           glob2rx(local_pattern[, 2]))
# [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

так что

local_pattern[str_detect("./csv files/DHFR 2019-04-09 04.59 PM_001.csv", glob2rx(local_pattern[,2])), 2]
# [1] *DHFR*.csv
0 голосов
/ 10 июня 2019

Если сопоставляется менее 10 шаблонов, вы можете собирать информацию с помощью захватов в стиле PERL в базе R. Сначала создайте шаблон с захватом (...).

pat <- paste(glob2rx(local_pattern$filename), collapse = ")|(")
pat <- paste0("(", pat, ")")

Назначьте текстстрока в переменную на данный момент:

x <- "./csv files/DHFR 2019-04-09 04.59 PM_001.csv"

Используйте regexpr или с большим усилием gregexpr, для нескольких совпадений:

m <- regexpr(pat, x, perl = TRUE)
sel <- which(attr(m, "capture.length") > 0)

Соберите необходимую информацию:

local_pattern[sel,]
>   condition   filename
> 4     dmhfr *DHFR*.csv

regmatches(x, m)
> [1] "./csv files/DHFR 2019-04-09 04.59 PM_001.csv"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...