Estrazione di numeri da vettori di stringhe

Ho una stringa come questa:

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

Vorrei grep solo il numero numerico da questo vettore. L’output previsto è un vettore:

 c(20, 1) 

Come procedo a fare questo?

Che ne dite di

 # 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)) 

Penso che la sostituzione sia un modo indiretto per arrivare alla soluzione. Se vuoi recuperare tutti i numeri, ti consiglio gregexpr :

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

Se hai più corrispondenze in una stringa, le otterranno tutte. Se ti interessa solo la prima partita, usa regexpr invece di gregexpr e puoi saltare la unlist .

Ecco un’alternativa alla prima soluzione di Arun, con un’espressione regolare più semplice simile a Perl:

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

Aggiornamento Poiché extract_numeric è deprecato, possiamo usare parse_number dal pacchetto readr .

 library(readr) parse_number(years) 

Ecco un’altra opzione con extract_numeric

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

Puoi anche sbarazzarti di tutte le lettere:

 as.numeric(gsub("[[:alpha:]]", "", years)) 

Probabilmente questo è meno generalizzabile però.

O semplicemente:

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

Una soluzione pipeline stringr :

 library(stringr) years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric 

Estrai i numeri da qualsiasi stringa nella posizione iniziale.

 x <- gregexpr("^[0-9]+", years) # Numbers with any number of digits x2 <- as.numeric(unlist(regmatches(years, x))) 

Estrarre numeri da qualsiasi stringa INDIPENDENTE di posizione.

 x <- gregexpr("[0-9]+", years) # Numbers with any number of digits x2 <- as.numeric(unlist(regmatches(years, x))) 

Dopo il post dal post di Gabor Grothendieck alla mailing list di r-help

 years<-c("20 years old", "1 years old") library(gsubfn) pat <- "[-+.e0-9]*\\d" sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])