regex - solo - Extrayendo números de vectores de cadenas
javascript regex test (9)
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))
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?
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
.
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]])
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)))
O simplemente:
as.numeric(gsub("//D", "", years))
# [1] 20 1
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))
También puedes deshacerte de todas las letras:
as.numeric(gsub("[[:alpha:]]", "", years))
Sin embargo, esto es menos generalizable.
Una solución stringr
:
library(stringr)
years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric
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