【问题标题】:R : find a pattern and editR : 找到一个模式并编辑
【发布时间】:2018-02-08 15:34:09
【问题描述】:

知道所有的问题关于添加leading zero 和为他们提供的综合回复,例如Q1Q2、@987654323 @。

但对我来说,至少根据我目前的知识,我无法解决我将要做的事情如下:

  • 使用regex 模式匹配在string 中添加leading zero 所以,我只想在- 之后将leading zero 添加到digits


例如:

Sam <- c("222-88", "537-457", "652-1", "787-892")
var <- LETTERS[1:4]
DF<- data.frame(Sam, var)
DF
      Sam var
1  222-88   A
2  537-457  B
3  652-1    C
4  787-892  D

预期结果:

     Sam   var
1  222-088   A
2  537-457   B
3  652-001   C
4  787-892   D

我试过了:

library(stringr)
temp <- DF[str_detect(DF$Sam, "-[0-9]{1,2}$"),] # will find the rows need the leading zero
temp 
     Sam var
1 222-88   A
3  652-1   C

formatC(temp$Sam, width = 2,flag = 0)# not correct!

【问题讨论】:

    标签: r regex text-processing stringr


    【解决方案1】:

    坚持tidyverse你可以试试:


    Sam <- c("222-88", "537-457", "652-1", "787-892")
    var <- LETTERS[1:4]
    df <- data.frame(Sam, var)
    
    library(dplyr)
    library(tidyr)
    library(stringr)
    
    df %>% 
      separate(Sam, c("sam1", "sam2")) %>% 
      mutate(Sam = str_c(sam1, "-", str_pad(sam2, 3, "left", "0"))) %>% 
      select(-sam1, -sam2)
    
    #>   var     Sam
    #> 1   A 222-088
    #> 2   B 537-457
    #> 3   C 652-001
    #> 4   D 787-892
    
    # OR
    
    df %>% 
      mutate(
        sam_new = str_c(
          str_extract(Sam, "^\\d+-"),
          str_extract(Sam, "\\d+$") %>% str_pad(3, "left", "0")
        )
      )
    
    #>       Sam var sam_new
    #> 1  222-88   A 222-088
    #> 2 537-457   B 537-457
    #> 3   652-1   C 652-001
    #> 4 787-892   D 787-892
    

    【讨论】:

      【解决方案2】:

      另一个基本选项

      Sam <- c("222-88", "537-457", "652-1", "787-892")
      m <- gregexpr("[0-9]+$", Sam)
      regmatches(Sam, m) <- sprintf('%03s', unlist(regmatches(Sam, m)))
      Sam
      
      # [1] "222-088" "537-457" "652-001" "787-892"
      

      【讨论】:

        【解决方案3】:

        我们可以使用base R 来做到这一点,通过将字符串拆分为-,然后在转换为numericpaste 后使用sprintf 填充0's

        DF$Sam <- sapply(strsplit(as.character(DF$Sam), "-"), function(x) 
               paste(x[1],sprintf("%03d", as.numeric(x[2])), sep="-"))
        DF$Sam
        #[1] "222-088" "537-457" "652-001" "787-892"
        

        如果我们需要正则表达式方法,我们可以使用gsubfn

        library(gsubfn)
        gsubfn("(\\d+)$", ~sprintf("%03d", as.numeric(x)), as.character(DF$Sam))
        #[1] "222-088" "537-457" "652-001" "787-892"
        

        【讨论】:

        • 谢谢,我们可以用stringr 或任何其他packages 来做吗?换句话说,还有其他更简单的选择吗?
        • @Daniel 更新为使用sprintfgsubfn 方法,以防止任何错误
        【解决方案4】:

        Base R 中的另一种选择是

        DF$Sam = sub("-(\\d)\\b", "-00\\1", DF$Sam)
        DF$Sam = sub("-(\\d\\d)\\b", "-0\\1", DF$Sam)
        DF
              Sam var
        1 222-088   A
        2 537-457   B
        3 652-001   C
        4 787-892   D
        

        【讨论】:

          猜你喜欢
          • 2018-11-02
          • 2013-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-13
          • 1970-01-01
          相关资源
          最近更新 更多