使用 R 在字符串中只保留完全大写的单词

Keeping only fully capitalized words in string using R

我有一个包含名字和姓氏向量的数据集。我想删除名字并只保留姓氏。虽然姓氏和名字的字数不同,但姓氏总是大写并且在名字之前,而只有名字的第一个字母大写。

换句话说,我有如下内容:

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

并希望拥有:

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

我一直在尝试用 stringr 包来做这个,但它只 returns 到第一个单词的第一个大写字母:

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

我们可以使用str_extract_all来提取所有大写的子串。 OP 的 post 中使用的模式只能匹配一个大写字母。我们需要一个或多个 ([A-Z]+) 以及单词边界 (\b)。输出将是 list,我们可以通过 sapply.

循环将其 paste 在一起
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"