Eu tenho uma string assim:
years<-c("20 years old", "1 years old")
Eu gostaria de usar o grep apenas para o número numérico desse vetor. A saída esperada é um vetor:
c(20, 1)
Como faço para fazer isso?
E se
# pattern is by finding a set of numbers in the start and capturing them
as.numeric(gsub("([0-9]+).*$", "\\1", years))
ou
# pattern is to just remove _years_old
as.numeric(gsub(" years old", "", years))
ou
# split by space, get the element in first index
as.numeric(sapply(strsplit(years, " "), "[[", 1))
.*
necessário? Se você quer no início, por que não usar^[[:digit:]]+
?.*
é necessário, pois você precisa corresponder a toda a string. Sem isso, nada é removido. Além disso, observe quesub
pode ser usado aqui em vez degsub
.gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")
Resultado: [1] "2730"gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")
Resultado: [1] "27 de junho –30 "Acho que a substituição é uma forma indireta de se chegar à solução. Se você deseja recuperar todos os números, recomendo
gregexpr
:Se você tiver várias correspondências em uma string, todas elas serão obtidas. Se você estiver interessado apenas na primeira correspondência, use em
regexpr
vez degregexpr
e poderá pular ounlist
.fonte
gregexpr
,regexpr
ou ambos?gregexpr
. Eu não tinha tentadoregexpr
até agora. Enorme diferença. Usar oregexpr
coloca entre as soluções de Andrew e Arun (o segundo mais rápido) em um conjunto 1e6. Talvez também seja interessante, usarsub
a solução de Andrew não melhora a velocidade.Atualizar Como
extract_numeric
está obsoleto, podemos usarparse_number
doreadr
pacote.Aqui está outra opção com
extract_numeric
fonte
parse_number
que não brinca com números negativos. Testeparse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
Aqui está uma alternativa para a primeira solução de Arun, com uma expressão regular semelhante ao Perl mais simples:
fonte
as.numeric(sub("\\D+","",years))
. Se houvesse cartas antes e | ou depois, entãogsub
Ou simplesmente:
fonte
Uma
stringr
solução em pipeline:fonte
Você também pode se livrar de todas as letras:
Provavelmente, isso é menos generalizável.
fonte
Extraia números de qualquer string na posição inicial.
Extraia números de qualquer string INDEPENDENTE de posição.
fonte
Também podemos usar
str_extract
destringr
Se houver vários números na string e quisermos extrair todos eles, podemos usar o
str_extract_all
qual, ao contrário,str_extract
retorna todos os macthes.fonte
Após a postagem de Gabor Grothendieck, poste na lista de discussão r-help
fonte
Usando o pacote unglue podemos fazer:
Criado em 06/11/2019 pelo pacote reprex (v0.3.0)
Mais informações: https://github.com/moodymudskipper/unglue/blob/master/README.md
fonte