Как найти позицию соответствия текстовой строки для каждого элемента в векторе в R?

#r

#r

Вопрос:

У меня есть вектор текстовых символов, скажем month.name:

 > month.name
 [1] "January"   "February"  "March"     "April"     "May"       "June"      "July"     
 [8] "August"    "September" "October"   "November"  "December" 
  

Какую функцию R я должен использовать, чтобы найти позицию «ber» так, чтобы она возвращала числовой вектор в форме c(-1,-1,-1,-1,-1,-1,-1,-1,7,5,6,6), т.е. -1 для отсутствия совпадения и 5 для пятого символа?

Ответ №1:

Это точный вывод ?regexpr (наряду с некоторыми другими полезными атрибутами):

 regexpr("ber", month.name)
# [1] -1 -1 -1 -1 -1 -1 -1 -1  7  5  6  6
#attr(,"match.length")
# [1] -1 -1 -1 -1 -1 -1 -1 -1  3  3  3  3
#attr(,"index.type")
#[1] "chars"
#attr(,"useBytes")
#[1] TRUE
  

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

1. Я знал, что одна из базовых функций регулярных выражений R сделает это 🙂

Ответ №2:

Вы могли бы использовать stringr::str_locate . Он возвращает матрицу:

 library(stringr)
str_locate(month.name, "ber")

      start end
 [1,]    NA  NA
 [2,]    NA  NA
 [3,]    NA  NA
 [4,]    NA  NA
 [5,]    NA  NA
 [6,]    NA  NA
 [7,]    NA  NA
 [8,]    NA  NA
 [9,]     7   9
[10,]     5   7
[11,]     6   8
[12,]     6   8
  

Итак str_locate(month.name, "ber")[, 'start'] , возвращает вектор:

  [1] NA NA NA NA NA NA NA NA  7  5  6  6
  

Лично я считаю, что NA — лучший выбор для «нет совпадения», чем -1. Вы всегда можете заменить -1 позже, если вы действительно этого хотите. Например:

 pos <- str_locate(month.name, "ber")[, 'start']
ifelse(is.na(pos), -1, pos)

 [1] -1 -1 -1 -1 -1 -1 -1 -1  7  5  6  6