Como colocar um 0 (zero) entre uma letra e um número?

Prezadxs, olá!

Tenho uma coluna com as seguintes informações: “B1”, “B2”, “B3”, … “B11”… Quando vou usar essa informação acabo tendo problemas com os números de 1 a 9, que possuem um tamanho menor que os outros (2 caracteres x 3 caracteres).

Como eu faço pra inserir um zero (0) entre o ‘B’ e o ‘1’, por exemplo? Quero fazer isso automaticamente apenas de 1 a 9, o 10 em diante já fica correto.

Segue pequena base para teste:

db <- tibble::tribble(
    ~bloco_original, ~bloco_desejado,
               "B1",           "B01",
               "B2",           "B02",
               "B3",           "B03",
               "B4",           "B04",
               "B5",           "B05",
               "B6",           "B06",
               "B7",           "B07",
               "B8",           "B08",
               "B9",           "B09",
              "B10",           "B10",
              "B11",           "B11",
              "B12",           "B12",
              "B13",           "B13",
              "B14",           "B14",
              "B15",           "B15"
    )

Created on 2021-12-01 by the reprex package (v2.0.1)

A única coisa que pensei até o momento foi:

  1. Validar se o valor tem 3 caracteres
  2. Extrair o primeiro e o segundo.
  3. Concatenar o primeiro com um zero seguido do segundo.
  4. Retornar meu resultado.

Existe alguma função ou método mais fácil de fazer isso?

Agradeço antecipadamente pela ajuda!

Abraços.

Maykon, acho que a função chave pra você é a stringr::str_pad(), que permite “preencher” uma string até que ela fique com o tamanho desejado. O único passo mais misterioso do meu código abaixo é o regex do tidyr::separate(); você pode achar mais informações sobre look arounds na colinha do stringr, mas o resumo é que eu quebro a string no primeiro caractere depois da letra ‘B’.

library(magrittr)

# Tabela exemplo
db <- tibble::tribble(
    ~bloco_original, ~bloco_desejado,
               "B1",           "B01",
               "B2",           "B02",
               "B3",           "B03",
               "B4",           "B04",
               "B5",           "B05",
               "B6",           "B06",
               "B7",           "B07",
               "B8",           "B08",
               "B9",           "B09",
              "B10",           "B10",
              "B11",           "B11",
              "B12",           "B12",
              "B13",           "B13",
              "B14",           "B14",
              "B15",           "B15"
    )

# Quebrar coluna original, fazer o pad do número e juntar
db %>%
  tidyr::separate(bloco_original, c("letra", "numero"), "(?<=B)") %>%
  dplyr::mutate(numero = stringr::str_pad(numero, 2, "left", "0")) %>%
  tidyr::unite("bloco_original", letra, numero, sep = "")
#> # A tibble: 15 × 2
#>    bloco_original bloco_desejado
#>    <chr>          <chr>         
#>  1 B01            B01           
#>  2 B02            B02           
#>  3 B03            B03           
#>  4 B04            B04           
#>  5 B05            B05           
#>  6 B06            B06           
#>  7 B07            B07           
#>  8 B08            B08           
#>  9 B09            B09           
#> 10 B10            B10           
#> 11 B11            B11           
#> 12 B12            B12           
#> 13 B13            B13           
#> 14 B14            B14           
#> 15 B15            B15

Created on 2021-12-02 by the reprex package (v2.0.1)

1 Curtida

Muito show, Caio!
Era bem isso que eu precisava. A sacada foi o regex, vou salvar essa colinha do stringr pra futuras consultas.
Muito obrigado pela ajuda!