【问题标题】:Extract letters from a string in R从R中的字符串中提取字母
【发布时间】:2015-09-03 21:43:43
【问题描述】:

我有一个包含变量名称的字符向量,例如x <- c("AB.38.2", "GF.40.4", "ABC.34.2")。我想提取字母,以便我现在有一个仅包含字母的字符向量,例如c("AB", "GF", "ABC")

因为字母的数量不同,我不能用substring指定第一个和最后一个字符。

我该怎么办?

【问题讨论】:

    标签: r string data-manipulation


    【解决方案1】:

    你可以试试

    sub("^([[:alpha:]]*).*", "\\1", x)
    [1] "AB"  "GF"  "ABC"
    

    【讨论】:

    • sub("[^[:alpha:]]+", "", x)
    • 或者,用library( "stringr" ),更清晰一点:str_extract(x, "[A-Z]+" )
    • vaettchen 如果我想使用诸如“ñ”之类的西班牙字符会怎样
    【解决方案2】:

    之前的答案似乎比必要的复杂。 This question 关于数字也适用于字母:

    > x <- c("AB.38.2", "GF.40.4", "ABC.34.2", "A B ..C 312, Fd", "  a")
    > gsub("[^a-zA-Z]", "", x)
    [1] "AB"    "GF"    "ABC"   "ABCFd" "a" 
    

    【讨论】:

      【解决方案3】:

      这就是我设法解决这个问题的方法。我使用它是因为它干净地返回 5 个项目,并且我可以控制是否要在单词之间留一个空格:

      x <- c("AB.38.2", "GF.40.4", "ABC.34.2", "A B ..C 312, Fd", "  a")
      
      extract.alpha <- function(x, space = ""){      
        require(stringr)
        require(purrr)
        require(magrittr)
        
        y <- strsplit(unlist(x), "[^a-zA-Z]+") 
        z <- y %>% map(~paste(., collapse = space)) %>% simplify()
        return(z)}
      
      extract.alpha(x, space = " ")

      【讨论】:

      • 顺便说一句,readr 有处理文本/字符分离的函数,查看 readr::parse_number() readr::parse_character() readr::parse_date()
      【解决方案4】:

      如果您将字母与空格混合在一起,则任何答案都不起作用。以下是我针对这些情况所做的工作:

      x <- c("AB.38.2", "GF.40.4", "ABC.34.2", "A B ..C 312, Fd")
      unique(na.omit(unlist(strsplit(unlist(x), "[^a-zA-Z]+"))))
      

      [1]“AB”“GF”“ABC”“A”“B”“C”“Fd”

      【讨论】:

        【解决方案5】:

        我意识到这是一个老问题,但由于我刚才正在寻找类似的答案并找到它,所以我想我会分享。

        我自己找到的最简单最快的解决方案:

        x <- c("AB.38.2", "GF.40.4", "ABC.34.2")
        only_letters <- function(x) { gsub("^([[:alpha:]]*).*$","\\1",x) }
        only_letters(x)
        

        输出是:

        [1] "AB"  "GF"  "ABC"
        

        希望这对某人有所帮助!

        【讨论】:

          猜你喜欢
          • 2021-04-14
          • 1970-01-01
          • 2017-07-30
          • 1970-01-01
          • 2023-02-14
          • 1970-01-01
          • 2022-01-08
          • 2021-03-15
          相关资源
          最近更新 更多