Para criar as regras, eu faria com dplyr::case_when().
Para extrair os números, como nesse vetor os números são apenas os CPFs, eu usaria o readr::parse_number().
Exemplo dessas funções com o código que vc enviou:
a <-
c("O CPF dele é 47896585",
"CPF é: 47589625698",
"123658987 é esse CPF",
"Cpf é: 25698568")
a |>
# transformar em tibble
tibble::enframe() |>
dplyr::mutate(
# extrair os números
numeros = readr::parse_number(value),
# contar o número de digitos iniciais
n_digitos_inicial = nchar(numeros),
# criar coluna de cpf com case_when
cpf = dplyr::case_when(
# se tiver 11 digitos, só mantem os numeros como texto
n_digitos_inicial == 11 ~ as.character(numeros),
# se tiver 9 digitos, só mantem os numeros como texto
n_digitos_inicial == 9 ~ paste0("00", as.character(numeros)),
TRUE ~ "REVISAR AS REGRAS"
),
cpf_forma2 = dplyr::case_when(
# se tiver 11 digitos, só mantem os numeros como texto
n_digitos_inicial == 11 ~ as.character(numeros),
# se tiver menos que 11 digitos, preencher do lado esquerdo com 0
n_digitos_inicial < 11 ~ paste0(strrep("0", 11 - n_digitos_inicial), numeros),
TRUE ~ "REVISAR AS REGRAS"
)
)
#> # A tibble: 4 × 6
#> name value numeros n_digitos_inicial cpf cpf_forma2
#> <int> <chr> <dbl> <int> <chr> <chr>
#> 1 1 O CPF dele é 47896585 47896585 8 REVISAR … 000478965…
#> 2 2 CPF é: 47589625698 47589625698 11 47589625… 475896256…
#> 3 3 123658987 é esse CPF 123658987 9 00123658… 001236589…
#> 4 4 Cpf é: 25698568 25698568 8 REVISAR … 000256985…
@Fernanda_Kelly
Sempre me deparo com esse problema, então uso muito o comando abaixo para padronizar os CPF’s com 11 dígitos e acrescentado o zero a esquerda.
a <- c("O CPF dele é 47896585",
"CPF é: 47589625698",
"123658987 é esse CPF",
"Cpf é: 25698568")
a %>% parse_number() %>%
str_trim() %>%
str_remove_all(.,"\\.|-" ) %>%
sprintf("%11s", .)%>%
str_replace_all(.," ","0")
Minha sugestão é usar stringr::str_pad(), que permite preencher strings para que elas fiquem com um tamanho estabelecido.
a <- c(
"O CPF dele é 47896585",
"CPF é: 47589625698",
"123658987 é esse CPF",
"Cpf é: 25698568"
)
# Preencher na esquerda com 0 até ficar com 11 caracteres
a |>
stringr::str_extract("[0-9]+") |>
stringr::str_pad(11, pad = "0")
#> [1] "00047896585" "47589625698" "00123658987" "00025698568"
Caio, fiz da sua forma e não entendi muito bem o pq que usando o pipe o R me deu uma lista em vez de um vetor. Então a cada linha eu tinha uma lista com o resultado do vetor. Já não utilizando o pipe funcionou maravilhosamente be,. Muito obrigada!
Será que você estava usando str_extract_all() sem querer? Essa função sempre retorna uma lista (diferentemente da str_extract() que só retorna um resultado por string) e notei que você fala sobre ela na sua pergunta.
Quando faço somente com o str_extract() ele pega a sequência de número da primeira linha e replica para todas as outras. Estranho? Muito. Daí não usei o pipe e tudo resolveu.