Как удалить первое слово строки во всем столбце? - PullRequest
1 голос
/ 20 июня 2020

У меня есть датафрейм со столбцами имен и фамилий. Мне нужно удалить все имена, оставив только фамилии, это в первом столбце, то есть исключить первую часть текста в каждой ячейке первого столбца.

Sociologist             Referencia
1  Peter Abell            Peter Abell
2  Mark Abrams            Mark Abrams
3  Janet Abu-Lughod       Janet Abu-Lughod
4  Jane Addams            Jane Addams
5  Theodor W. Adorno      Theodor W. Adorno
6  Richard Alba           Richard Alba

Я пробовал использовать код, взятый из аналогичного вопроса, но он удаляет фамилии, а не имена, что мне и нужно. Код выглядит следующим образом:

Sociologos_df$word<- sub("([A-Za-z]+).*", "\\1", Sociologos_df$word)

Итак, как мне удалить первую часть строк в столбце?

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Не вдаваясь в регулярное выражение и сохраняя его простым, мы можем использовать word из stringr, чтобы извлечь последнее слово в каждом имени, предполагая, что это будет фамилия.

stringr::word(df$Sociologist, -1)
#[1] "Abell"      "Abrams"     "Abu-Lughod" "Addams"     "Adorno"     "Alba" 

Это может быть не общим решением, но должно работать в большинстве случаев.

данные

df <- structure(list(Sociologist = c("Peter Abell", "Mark Abrams", 
"Janet Abu-Lughod", "Jane Addams", "Theodor W. Adorno", "Richard Alba"
)), class = "data.frame", row.names = c(NA, -6L))
0 голосов
/ 20 июня 2020

Если вы используете 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", сначала захватите и удалите, затем попробуйте ввести фамилии).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...