Подтвердить что ты не робот

Извлечение уникальных чисел из строки в R

У меня есть список строк, которые содержат случайные символы, такие как:

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

Я хотел бы знать, какие числа присутствуют хотя бы один раз (unique()) в этом списке. Решение моего примера:

решение: c(7,667,11,5,2)

Если у кого-то есть метод, который не рассматривает 11 как "одиннадцать", а как "один и один", это также было бы полезно. Решение в этом условии было бы следующим:

решение: c(7,6,1,5,2)

(Я нашел этот пост по теме: Извлечение чисел из векторов строк)

4b9b3361

Ответ 1

Во втором ответе вы можете использовать gsub для удаления всего из строки, а не числа, затем разделите строку следующим образом:

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

Для первого ответа, используя strsplit,

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

PS: не называйте свою переменную list (так как есть встроенная функция list). Я назвал ваши данные как ll.

Ответ 2

Вот еще один ответ, который использует gregexpr для поиска чисел и regmatches для их извлечения:

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

Ответ 3

Решение с использованием stringi

 # extract the numbers:

 nums <- stri_extract_all_regex(list, "[0-9]+")

 # Make vector and get unique numbers:

 nums <- unlist(nums)
 nums <- unique(nums)

И это ваше первое решение

Снимок экрана из строки в R

Для второго решения я использовал бы substr:

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

Ответ 4

Вы можете использовать ?strsplit (как предложено в ответе @Arun в Извлечение чисел из векторов (строк)):

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

Ответ 5

A stringr с str_match_all и операторами с каналами. Для первого решения:

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

Второе решение:

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

(Примечание: я также назвал список ll)

Ответ 6

Используйте strsplit, используя шаблон как обратный к числовым цифрам: 0-9

В приведенном примере выполните следующее:

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

Затем просто возьмите объединение всех `наборов 'в списке, например:

tmp <- Reduce(union, tmp)

Затем вам нужно удалить пустую строку.

Ответ 7

Проверьте extract_numbers() функцию из пакета filesstrings. Установите его через 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