140 votes

Extraction de nombres à partir de vecteurs de chaînes de caractères

J'ai une chaîne comme ça :

years<-c("20 years old", "1 years old")

Je voudrais grep seulement le nombre numérique de ce vecteur. La sortie attendue est un vecteur :

c(20, 1)

Comment dois-je m'y prendre ?

112voto

Arun Points 41689

Et si

# pattern is by finding a set of numbers in the start and capturing them
as.numeric(gsub("([0-9]+).*$", "\\1", years))

o

# pattern is to just remove _years_old
as.numeric(gsub(" years old", "", years))

o

# split by space, get the element in first index
as.numeric(sapply(strsplit(years, " "), "[[", 1))

102voto

akrun Points 148302

Mise à jour Depuis extract_numeric est déprécié, nous pouvons utiliser parse_number de readr paquet.

library(readr)
parse_number(years)

Voici une autre option avec extract_numeric

library(tidyr)
extract_numeric(years)
#[1] 20  1

71voto

sebastian-c Points 5657

Je pense que la substitution est un moyen indirect d'arriver à la solution. Si vous voulez retrouver tous les chiffres, je recommande gregexpr :

matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))

Si vous avez plusieurs correspondances dans une chaîne de caractères, elle les obtiendra toutes. Si vous n'êtes intéressé que par la première correspondance, utilisez regexpr au lieu de gregexpr et vous pouvez sauter l'étape unlist .

39voto

Andrew Points 3589

Voici une alternative à la première solution d'Arun, avec une expression régulière plus simple de type Perl :

as.numeric(gsub("[^\\d]+", "", years, perl=TRUE))

38voto

989 Points 8782

Ou simplement :

as.numeric(gsub("\\D", "", years))
# [1] 20  1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X