2017-08-30 65 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