【问题标题】:Keeping only fully capitalized words in string using R使用 R 在字符串中仅保留完全大写的单词
【发布时间】:2016-04-11 11:27:39
【问题描述】:

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

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

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" 

【问题讨论】:

标签: r stringr


【解决方案1】:

我们可以使用str_extract_all 来提取所有大写的子字符串。 OP 帖子中使用的模式只能匹配一个大写字母。我们需要一个或多个 ([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"   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2018-05-27
    • 2016-09-06
    • 2021-08-02
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多