Найти ячейку с помощью grepl и который

#r #regex #readxl

#r #регулярное выражение #readxl

Вопрос:

Я пытаюсь найти ячейку в data.frame, которая начинается с заданного шаблона (мне нужно выполнить поиск по строкам и столбцам). Данные.кадры поступают из книг Excel, которые считываются readxl пакетом. Расположение шаблона зависит от рабочей книги. Итак, в книге 1 это может быть в ячейке B12, но в книге 2 это будет в C12. Однако, как только я нахожу ячейку «привязки», я могу посмотреть на 1 ячейку вправо и найти числовое значение, которое меня интересует.

В настоящее время я использую это:

 my_data <- iris
my_data$Species <- as.character(my_data$Species)
my_data[99,5] <- 'my_string'
my_data[109,5] <- 'my_string_too'

target_val <- 'my_string'
which(my_data == target_val, arr.ind = T)
  

Это хорошо для точных совпадений, но я хотел бы получить функциональность grepl для использования таких вещей, как «начинается с» или «ИЛИ», но не могу понять, как их объединить. Есть ли способ сделать что-то подобное:

 which(my_data[grepl('my_string|my_string_too', my_data, ignore.case = T)], arr.ind = T)
  

Комментарии:

1. Используется '^(?:my_string|my_string_too)' для проверки, начинается ли строка с my_string или my_string_too

2. Я не уверен, что понимаю, вы имеете в виду следующее : which(sapply(my_data, function(x) grepl("^my_string", x)), arr.ind = TRUE) . Если нет, можете ли вы уточнить?

3. @Andrew — это именно то, что я ищу!

Ответ №1:

Вы можете использовать sapply() which выведет матрицу (в данном случае), а затем использовать which() так, как вы использовали ее раньше. Конечно, этот метод распространяется на использование с %in% , startsWith() или endsWith() , или grepl() fixed = TRUE с помощью, если вы выполняете буквальное сопоставление строк.

 which(sapply(my_data, function(x) grepl("^my_string", x)), arr.ind = TRUE)

     row col
[1,]  99   5
[2,] 109   5