使用 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"
我有一个包含名字和姓氏向量的数据集。我想删除名字并只保留姓氏。虽然姓氏和名字的字数不同,但姓氏总是大写并且在名字之前,而只有名字的第一个字母大写。
换句话说,我有如下内容:
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"