Извлечение уникальных чисел из строки в 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)
(Я нашел этот пост по теме: Извлечение чисел из векторов строк)
Ответы
Ответ 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