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 quesubse 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
regexprlugar degregexpry puede omitir elunlist.fuente
gregexpr,regexpro ambos?gregexpr. No lo había intentadoregexprhasta ahora. Gran diferencia. Usar loregexprcoloca entre las soluciones de Andrew y Arun (el segundo más rápido) en un set de 1e6. Quizás también sea interesante, usarsuben la solución de Andrew no mejora la velocidad.Actualización Dado que
extract_numericestá en desuso, podemos usarparse_numberfromreadrpackage.Aquí hay otra opción con
extract_numericfuente
parse_numberque no se juega con números negativos. Tryparse_number("–27,633")readr::parse_number("-12,345") # [1] -12345Aquí 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, entoncesgsubO simplemente:
fuente
Una
stringrsolució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_extractdesdestringrSi hay varios números en la cadena y queremos extraerlos todos, podemos usar
str_extract_allque, a diferencia de,str_extractdevuelve 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