Extraindo números exclusivos da string em R

Eu tenho uma lista de seqüências de caracteres que contêm caracteres randoms, como:

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

Gostaria de saber quais números estão presentes pelo menos uma vez ( unique() ) nessa lista. A solução do meu exemplo é:

solução: c(7,667,11,5,2)

Se alguém tiver um método que não considere 11 como “onze”, mas como “um e um”, também seria útil. A solução nesta condição seria:

solução: c(7,6,1,5,2)

(Eu encontrei este post sobre um assunto relacionado: Extraindo números de vetores de seqüências de caracteres )

Para a segunda resposta, você pode usar o gsub para remover tudo da string que não é um número e depois dividir a string da seguinte maneira:

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

Para a primeira resposta, da mesma forma usando strsplit ,

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

PS: não nomeie sua list variables ​​(pois há uma list funções embutidas). Eu nomeei seus dados como ll .

Aqui está outra resposta, esta usando o gregexpr para encontrar os números e regmatches para extraí-los:

 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 

Uma solução usando o stringi

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

E essa é sua primeira solução

Captura de tela do on-liner em R

Para a segunda solução, usaria substr :

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

Você poderia usar ?strsplit (como sugerido na resposta do @ Arun em Extraindo números de vetores (de strings) ):

 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 

Uma solução stringr com str_match_all e operadores canalizados. Para a primeira solução:

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

Segunda solução:

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

(Nota: Eu também liguei para a lista ll )

Use strsplit usando o padrão como o inverso dos dígitos numéricos: 0-9

Para o exemplo que você forneceu, faça o seguinte:

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

Então simplesmente pegue uma união de todos os `sets 'na lista, assim:

 tmp <- Reduce(union, tmp) 

Então você só tem que remover a string vazia.

Confira a function filesstrings extract_numbers() do pacote filesstrings . Instale-o via 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