Эти однострочники не используют никаких пакетов или регулярных выражений, кроме фиксированных строк.
1) Мы подбираем имена в заголовках и затем переупорядочиваем в исходном порядке:
with(stack(sapply(names, grep, titles, fixed = TRUE)), ind[order(values)])
## [1] Mike Trout Mookie Betts Ronald Acuna Cody Bellinger Ronald Acuna
## [6] Mookie Betts
## Levels: Mookie Betts Cody Bellinger Mike Trout Ronald Acuna
2) Создает матрицу, строки которой соответствуют именам, а столбцы соответствуют заголовкам. Позиция единственной ИСТИНЫ в каждом столбце является индексом имени, соответствующего этому названию.
names[colSums(outer(names, titles, Vectorize(grepl)) * seq_along(names))]
## [1] "Mike Trout" "Mookie Betts" "Ronald Acuna" "Cody Bellinger"
## [5] "Ronald Acuna" "Mookie Betts"
3) В примере в вопросе всегда есть 4 слова в каждомназвание и средние 2 слова - это имя. Если бы это всегда было так, то мы могли бы извлечь имена, даже не используя вектор names
:
with(read.table(text = titles, as.is = TRUE)[2:3], paste(V2, V3))
## [1] "Mike Trout" "Mookie Betts" "Ronald Acuna" "Cody Bellinger"
## [5] "Ronald Acuna" "Mookie Betts"