Tengo una cadena como esta:
years<-c("20 years old", "1 years old")
Me gustaría grep solo el número numérico de este vector. La salida esperada 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))
.*
necesario? Si los quiere al principio, ¿por qué no usarlos^[[:digit:]]+
?.*
es necesario ya que debe hacer coincidir toda la cadena. Sin eso, no se quita nada. Además, tenga en cuenta quesub
se puede utilizar aquí en lugar degsub
.gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")
Resultado: [1] "2730"gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")
Resultado: [1] "27 de junio –30 "Creo que la sustitución es una forma indirecta de llegar a la solución. Si desea recuperar todos los números, le recomiendo
gregexpr
:Si tiene varias coincidencias en una cadena, esto las obtendrá todas. Si solo está interesado en la primera coincidencia, use en
regexpr
lugar degregexpr
y puede omitir elunlist
.fuente
gregexpr
,regexpr
o ambos?gregexpr
. No lo había intentadoregexpr
hasta ahora. Gran diferencia. Usar loregexpr
coloca entre las soluciones de Andrew y Arun (el segundo más rápido) en un set de 1e6. Quizás también sea interesante, usarsub
en la solución de Andrew no mejora la velocidad.Actualización Dado que
extract_numeric
está en desuso, podemos usarparse_number
fromreadr
package.Aquí hay otra opción con
extract_numeric
fuente
parse_number
que no se juega con números negativos. Tryparse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
Aquí hay una alternativa a la primera solución de Arun, con una expresión regular similar a Perl más simple:
fuente
as.numeric(sub("\\D+","",years))
. Si hubo letras antes y | o después, entoncesgsub
O simplemente:
fuente
Una
stringr
solución canalizada:fuente
También podrías deshacerte de todas las letras:
Sin embargo, es probable que esto sea menos generalizable.
fuente
Extrae números de cualquier cadena en la posición inicial.
Extrae números de cualquier cadena INDEPENDIENTE de la posición.
fuente
También podemos utilizar
str_extract
desdestringr
Si hay varios números en la cadena y queremos extraerlos todos, podemos usar
str_extract_all
que, a diferencia de,str_extract
devuelve todos los macthes.fuente
Después de la publicación de Gabor Grothendieck en la lista de correo de r-help
fuente
Usando el paquete unglue podemos hacer:
Creado el 2019-11-06 por el paquete reprex reprex (v0.3.0)
Más información: https://github.com/moodymudskipper/unglue/blob/master/README.md
fuente