J'ai une chaîne comme celle-ci:
years<-c("20 years old", "1 years old")
Je voudrais grep uniquement le nombre numérique de ce vecteur. La sortie attendue est un vecteur:
c(20, 1)
Comment dois-je procéder?
Que diriez-vous
# 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))
.*
nécessaire? Si vous les voulez au départ, pourquoi ne pas les utiliser^[[:digit:]]+
?.*
est nécessaire car vous devez faire correspondre la chaîne entière. Sans cela, rien n'est supprimé. Notez également que celasub
peut être utilisé ici à la place degsub
.gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")
Résultat: [1] "2730"gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")
Résultat: [1] "27 juin –30 "Je pense que la substitution est un moyen indirect d'arriver à la solution. Si vous souhaitez récupérer tous les numéros, je vous recommande
gregexpr
:Si vous avez plusieurs correspondances dans une chaîne, cela les obtiendra toutes. Si vous n'êtes intéressé que par le premier match, utilisez à la
regexpr
place degregexpr
et vous pouvez ignorer leunlist
.la source
gregexpr
,regexpr
ou les deux?gregexpr
. Je n'avais pas essayéregexpr
jusqu'à maintenant. Énorme différence. L'utilisation leregexpr
met entre les solutions d'Andrew et d'Arun (deuxième plus rapide) sur un set 1e6. Peut-être aussi intéressant, l'utilisationsub
dans la solution d'Andrew n'améliore pas la vitesse.Update Depuis
extract_numeric
est obsolète, nous pouvons utiliserparse_number
fromreadr
package.Voici une autre option avec
extract_numeric
la source
parse_number
que ne joue pas avec des nombres négatifs. Essayerparse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
Voici une alternative à la première solution d'Arun, avec une expression régulière plus simple de type Perl:
la source
as.numeric(sub("\\D+","",years))
. S'il y avait des lettres avant et | ou après, alorsgsub
Ou simplement:
la source
Une
stringr
solution en pipeline:la source
Vous pouvez également vous débarrasser de toutes les lettres:
Cela est probablement moins généralisable.
la source
Extrayez les nombres de n'importe quelle chaîne à la position de début.
Extraire les nombres de n'importe quelle chaîne INDÉPENDANTE de position.
la source
Nous pouvons également utiliser
str_extract
destringr
S'il y a plusieurs nombres dans la chaîne et que nous voulons tous les extraire, nous pouvons utiliser
str_extract_all
qui, contrairement à,str_extract
renvoie tous les macthes.la source
Après le message de Gabor Grothendieck, postez sur la liste de diffusion r-help
la source
En utilisant le package unglue, nous pouvons faire:
Créé le 06/11/2019 par le package reprex (v0.3.0)
Plus d'infos: https://github.com/moodymudskipper/unglue/blob/master/README.md
la source