Мы можем использовать separate
с поиском регулярных выражений
library(dplyr)
library(tidyr)
df1 %>%
separate(name_position, into = c("name", "position"),
sep="(?<=[A-Z])(?=[A-Z][a-z])")
# name position
#1 RAHEEM STERLING Forward
#2 MARCUS RASHFORD Forward
#3 JORDAN HENDERSON Midfielder
#4 JORDAN PICKFORD Goalkeeper
#5 KYLE WALKER Defender
Если у нас есть собственный вектор, то одним из вариантов является создание вектора-терна pat
путем создания одной строки
library(stringr)
pat <- str_c(positions, collapse="|")
df1 %>%
transmute(name = str_remove(name_position, pat),
position = str_extract(name_position, pat))
данные
df1 <- structure(list(name_position = c("RAHEEM STERLINGForward", "MARCUS RASHFORDForward",
"JORDAN HENDERSONMidfielder", "JORDAN PICKFORDGoalkeeper",
"KYLE WALKERDefender"
)), class = "data.frame", row.names = c(NA, -5L))