una texto separar reemplazar palabra extraer como columnas caracteres cadena buscar string r grep character gsub

string - texto - gsub r



Extrayendo nĂșmeros Ășnicos de una cadena en R (7)

Tengo una lista de cadenas que contienen caracteres aleatorios como:

list=list() list[1] = "djud7+dg[a]hs667" list[2] = "7fd*hac11(5)" list[3] = "2tu,g7gka5"

Me gustaría saber qué números están presentes al menos una vez ( unique() ) en esta lista. La solución de mi ejemplo es:

solución: c(7,667,11,5,2)

Si alguien tiene un método que no considera 11 como "once" sino como "uno y uno", también sería útil. La solución en esta condición sería:

solución: c(7,6,1,5,2)

(Encontré esta publicación en un tema relacionado: Extracción de números de vectores de cadenas )


Una solución que usa stringi

# extract the numbers: nums <- stri_extract_all_regex(list, "[0-9]+") # Make vector and get unique numbers: nums <- unlist(nums) nums <- unique(nums)

Y esa es tu primera solución

Para la segunda solución usaría substr :

nums_first <- sapply(nums, function(x) unique(substr(x,1,1)))


Aquí hay otra respuesta, esta usando gregexpr para encontrar los números y los regmatches para extraerlos:

l <- c("djud7+dg[a]hs667", "7fd*hac11(5)", "2tu,g7gka5") temp1 <- gregexpr("[0-9]", l) # Individual digits temp2 <- gregexpr("[0-9]+", l) # Numbers with any number of digits as.numeric(unique(unlist(regmatches(l, temp1)))) # [1] 7 6 1 5 2 as.numeric(unique(unlist(regmatches(l, temp2)))) # [1] 7 667 11 5 2


Consulte la función extract_numbers() del paquete filesstrings . Instalarlo a través de install.packages("filesstrings") .

library(filesstrings) #> Loading required package: stringr list=list() list[1] = "djud7+dg[a]hs667" list[2] = "7fd*hac11(5)" list[3] = "2tu,g7gka5" charvec <- unlist(list) print(charvec) #> [1] "djud7+dg[a]hs667" "7fd*hac11(5)" "2tu,g7gka5" extract_numbers(charvec) #> [[1]] #> [1] 7 667 #> #> [[2]] #> [1] 7 11 5 #> #> [[3]] #> [1] 2 7 5 unique(unlist(ExtractNumbers(charvec))) #> [1] 7 667 11 5 2


Para la segunda respuesta, puede usar gsub para eliminar todo de la cadena que no es un número, luego divida la cadena de la siguiente manera:

unique(as.numeric(unlist(strsplit(gsub("[^0-9]", "", unlist(ll)), "")))) # [1] 7 6 1 5 2

Para la primera respuesta, de manera similar usando strsplit ,

unique(na.omit(as.numeric(unlist(strsplit(unlist(ll), "[^0-9]+"))))) # [1] 7 667 11 5 2

PD: no nombre su list variables (ya que hay una list funciones incorporada). He nombrado tus datos como ll .


Puedes usar ?strsplit (como se sugiere en la respuesta de @ Arun en Extrayendo números de vectores (de cadenas) ):

l <- c("djud7+dg[a]hs667", "7fd*hac11(5)", "2tu,g7gka5") ## split string at non-digits s <- strsplit(l, "[^[:digit:]]") ## convert strings to numeric ("" become NA) solution <- as.numeric(unlist(s)) ## remove NA and duplicates solution <- unique(solution[!is.na(solution)]) # [1] 7 667 11 5 2


Una solución de str_match_all con str_match_all y operadores canalizados. Para la primera solución:

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

Segunda solución:

str_match_all(ll, "[0-9]") %>% unlist %>% unique %>% as.numeric

(Nota: también llamé a la lista ll )


Use strsplit usando el patrón como el inverso de los dígitos numéricos: 0-9

Para el ejemplo que ha proporcionado, haga esto:

tmp <- sapply(list, function (k) strsplit(k, "[^0-9]"))

Luego, simplemente tome una unión de todos los ''conjuntos'' en la lista, así:

tmp <- Reduce(union, tmp)

Entonces solo tienes que eliminar la cadena vacía.