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.