Tenho os seguintes dados,
id <- c("case1", "case19", "case88", "case77")
vec <- c("One_20 (19)",
"tWo_20 (290)",
"Three_38 (399)",
NA)
df <- data.frame(id, vec)
> df
id vec
1 case1 One_20 (19)
2 case19 tWo_20 (290)
3 case88 Three_38 (399)
4 case77 <NA>
Quero separar o vec
vetor em duas variáveis, a saber: txt
e num
. Estou preferindo usar tidyr
desta forma,
df |> tidyr::separate_wider_regex(vec,
c(txt = "[A-Za-z]+", num = "\\d+"),
too_few = "align_start")
# A tibble: 4 × 3
id txt num
<chr> <chr> <chr>
1 case1 One NA
2 case19 tWo NA
3 case88 Three NA
4 case77 NA NA
Porém, não é isso que eu quero. Tenho a seguinte expectativa:
id txt num
1 case1 One_20 19
2 case19 tWo_20 290
3 case88 Three_38 399
4 case77 <NA> NA
Estou cometendo erros na parte regex. Alguém pode me ajudar a corrigir esses erros para que eu possa ter a tabela esperada como saída?
Uma maneira em R base usando
sub()
:Tentar
Nem sempre sou o melhor em regex, então tento evitá-lo quando possível. Uma abordagem sem regex para alguém com dados semelhantes seria usar
separate_wider_delim
. Isso separará o "number_text" do "(number)", entãoreadr::parse_number
extrairá o valor numérico denum
:Você também pode substituir
parse_number
por outro método de sua escolha, ou seja,mutate(num = as.numeric(gsub("\\(|\\)", "", num)))
.Você não precisa usar nenhum pacote externo ou frase de efeito sofisticada, desde que sua regex seja bem construída.
Para sua necessidade específica, este padrão funciona:
Então você pode usá-lo diretamente para atribuir às colunas necessárias no df, usando sub:
ou, se você quiser evitar executar o regexp mais de uma vez, use regmatches/regexec e lapply: