Extrayendo números de vectores de cadenas

Tengo una cuerda como esta:

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

Me gustaría grep solo el número numérico de este vector. El resultado esperado es un vector:

 c(20, 1) 

¿Cómo voy a hacer esto?

Qué tal 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)) 

Creo que la sustitución es una forma indirecta de llegar a la solución. Si quieres recuperar todos los números, te recomiendo gregexpr :

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

Si tiene varias coincidencias en una cadena, obtendrá todas. Si solo está interesado en la primera coincidencia, use regexpr lugar de gregexpr y puede omitir la unlist .

Aquí hay una alternativa a la primera solución de Arun, con una expresión regular similar a Perl:

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

Actualización Como extract_numeric está en desuso, podemos usar parse_number del paquete readr .

 library(readr) parse_number(years) 

Aquí hay otra opción con extract_numeric

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

También puedes deshacerte de todas las letras:

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

Sin embargo, esto es menos generalizable.

O simplemente:

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

Una solución stringr :

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

Extraiga los números de cualquier cadena en la posición inicial.

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

Extrae los números de cualquier cadena INDEPENDIENTE de la posición.

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

Después de la publicación de Gabor Grothendieck en la lista de correo 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]])