#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