【问题标题】:Split a character to letters and numbers将字符拆分为字母和数字
【发布时间】:2017-08-21 20:01:25
【问题描述】:

我有一个独特的字符,每个字母跟一个数字。例如:A1B10C5

我想使用 R 将其拆分为 letter <- c(A, B, C)number <- c(1, 10, 5)

【问题讨论】:

    标签: r regex split


    【解决方案1】:

    我们可以使用正则表达式来分割字母和数字

    v1 <- strsplit(str1, "(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])", perl = TRUE)[[1]]
    v1[c(TRUE, FALSE)]
    #[1] "A" "B" "C"
    
    as.numeric(v1[c(FALSE, TRUE)])
    #[1]  1 10  5
    

    数据

    str1 <- "A1B10C5"
    

    【讨论】:

    • 我可能会建议 OP 以某种方式将它们放在一起,例如 data.frame(L = v1[c(TRUE, FALSE)], N = as.numeric(v1[c(FALSE, TRUE)]))
    • 你真的需要积极的回顾吗?我认为像strsplit(str1, "[0-9]+") %&gt;% unlist() 这样的东西会起作用。
    • @user 在这种情况下,数字去哪儿了?它们也是必需的。
    • @user 是的,你是对的,也可以使用它,然后对字母进行第二次拆分
    • @Frank 我只是在谈论他的第一行。您可以使用另一个 strsplit 作为数字。但现在我看着它。 @akrun 使用一次正则表达式并使用逻辑索引分别提取字母和数字
    【解决方案2】:

    str_extract_all 是另一种方法:

    library(stringr)
    
    > str <- "A1B10C5"
    > str
    [1] "A1B10C5"
    
    > str_extract_all(str, "[0-9]+")
    [[1]]
    [1] "1"  "10" "5" 
    
    > str_extract_all(str, "[aA-zZ]+")
    [[1]]
    [1] "A" "B" "C"
    

    【讨论】:

    • str_replace_allstringr 包中可用。
    【解决方案3】:

    要同时提取字母和数字,您可以使用str_match_all 将字母和数字分到两个单独的列中:

    library(stringr)
    str_match_all("A1B10C5", "([a-zA-Z]+)([0-9]+)")[[1]][,-1]
    
    #     [,1] [,2]
    #[1,] "A"  "1" 
    #[2,] "B"  "10"
    #[3,] "C"  "5" 
    

    【讨论】:

      【解决方案4】:

      您还可以将基本 R regmatchesgregexpr 一起使用:

      regmatches(this, gregexpr("[0-9]+",  "A1B10C5"))
      [[1]]
      [1] "1"  "10" "5" 
      
      regmatches(this, gregexpr("[A-Z]+",  "A1B10C5"))
      [[1]]
      [1] "A" "B" "C"
      

      这些返回带有单个元素的列表,一个字符向量。正如 akrun 所做的那样,您可以使用 [[1]] 提取列表项,还可以将数字向量转换为数字,如下所示:

      as.numeric(regmatches(this, gregexpr("[0-9]+", this))[[1]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-30
        • 1970-01-01
        • 2019-05-26
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多