Если вы используете sub("([A-Za-z]+).*", "\\1", df$word)
для своих имен, то вы можете использовать аналог для фамилий:
sub(".*\\s([A-Za-z]+)$", "\\1", dat$Sociologist)
# [1] "Abell" "Abrams" "Lughod" "Addams" "Adorno" "Alba"
Обратите внимание, что мы отрезаем Abu-
, но в этом случае вы можете захотеть расширить logi c для букв.
sub(".*\\s([-A-Za-z]+)$", "\\1", dat$Sociologist)
# [1] "Abell" "Abrams" "Abu-Lughod" "Addams" "Adorno" "Alba"
Обратите внимание, что начальный -
в [-A-Za-z]
обозначает буквальный da sh, где любые другие тире обозначают диапазоны символов (т.е. , A-Z
обозначает * "от A
до Z
, лексикографически).
В качестве альтернативы, если вы хотите быть немного более либеральным, вы можете использовать \\S
(заглавная« S ») для обозначения «любых непробельных символов»:
sub(".*\\s(\\S+)$", "\\1", dat$Sociologist)
Результат такой же, как и в предыдущем случае, но возможно использование некоторых других символов, таких как одинарные кавычки (например, D'Angelo
) и возможно, другие я здесь не рассматриваю. Хотя я подозреваю, что logi c "без пробелов" достаточно хорошо справляется с акцентированными буквами и разными фамилиями, такие имена, как "Van Wilder", не будут правильно пойманы (если вы хочу и "фургон").
* 102 2 * Также проблемы: «Jr», «Sr», «III», «IV» и др. c. Есть много шаблонов, которые являются хорошими стартовыми для обнаружения всех этих (
https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s18.html), хотя часто может быть лучше не пытаться получить их все в одном регулярном выражении шаблона (например, ищите "III" , "IV", сначала захватите и удалите, затем попробуйте ввести фамилии).