2017-08-30 59 views
3

知道所有的问题关于添加leading zero全面响应为他们提供诸如Q1Q2Q3R:找到一个模式和编辑

但对我来说,至少根据我目前所知,我不能够解决什么,我要做的事情如下:

  • 添加leading zero使用regex模式匹配 所以一个string,我想在-之后将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! 

回答

3

我们可以base R做到这一点,通过-分割字符串和T母鸡用sprintf到垫0的转换为numeric后再paste

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" 
+0

Thnk,我们能否用'stringr'或任何其他'packages'办呢?换句话说,还有其他更容易的选择吗? – Daniel

+1

@Daniel更新为'gsubfn'方法,它使用'sprintf',以防止任何错误 – akrun

1

在基础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 
3

另一个基本选项

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" 
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