В вашем случае может работать только следующее:
sapply(df$notes, function(x) {
grep("am|pm", unlist(strsplit(x, " ")), value = T)
}, USE.NAMES = FALSE)
[1] "4-7pm" "5-9pm" "7-9am"
Тем не менее, это все еще может не сработать из-за крайних случаев.
Вы также можете попробовать регулярные выражения, чтобы извлечь все работы, заканчивающиеся на am или pm
Посмотрите на stringr
, чтобы найти извлекаемые символы и построить радиус:
stringr::str_locate(df$notes, "am|pm")
start end
[1,] 26 27
[2,] 28 29
[3,] 37 38