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.