Сохранение в строке только полностью заглавных слов с использованием R

У меня есть набор данных, содержащий вектор имен и фамилий. Я хочу удалить имена и оставить только фамилии. Хотя и фамилии, и имена различаются по количеству слов, фамилия (имена) всегда пишутся прописными буквами и ставятся перед именами, в то время как только первая буква имени (имен) пишется с заглавной буквы.

Другими словами, у меня получается примерно следующее:

x <- c("AA AA Aa Aa", "BB BB Bb", "CC Cc Cc", "DD Dd")

И хотел бы иметь:

x
[1] "AA AA" "BB BB" "CC" "DD"    

Я пытался сделать это с помощью пакета stringr, но он возвращается только к первой заглавной букве первого слова:

library(stringr)
str_extract(x, "[A-Z]")
[1] "A" "B" "C" "D" 

person odm_mc    schedule 11.04.2016    source источник
comment
str_extract_all(x, "([A-Z]+(?=[^a-z]))") может быть?   -  person David Arenburg    schedule 11.04.2016
comment
Возможный дубликат проверьте заглавные слова в тексте и извлеките его   -  person divibisan    schedule 18.03.2019


Ответы (1)


Мы можем использовать str_extract_all для извлечения всех подстрок с заглавной буквы. Шаблон, используемый в сообщении OP, может соответствовать только одной заглавной букве. Нам нужен один или несколько ([A-Z]+) вместе с границей слова (\\b). Результатом будет list, который мы можем paste вместе, выполнив цикл с sapply.

library(stringr)
sapply(str_extract_all(x, "\\b[A-Z]+\\b"), paste, collapse= ' ')
#[1] "AA AA" "BB BB" "CC"    "DD"   

Или используя gsub

trimws(gsub("[[:alpha:]][a-z]+|[a-z][[:alpha:]]+", "", x))
#[1] "AA AA" "BB BB" "CC"    "DD"  

Использование другого вектора

x1 <- c(x, "eE ee EE")
sapply(str_extract_all(x1, "\\b[A-Z]+\\b"), paste, collapse= ' ')
#[1] "AA AA" "BB BB" "CC"    "DD"    "EE"   

trimws(gsub("[[:alpha:]][a-z]+|[a-z][[:alpha:]]+", "", x1))
#[1] "AA AA" "BB BB" "CC"    "DD"    "EE"   
person akrun    schedule 11.04.2016