我有一个包含随机字符的字符串列表,例如:
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)
(我在相关主题上发现了这篇文章:Extracting numbers from vectors of strings)
答案 0 :(得分:56)
对于第二个答案,您可以使用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
。
答案 1 :(得分:16)
这是另一个答案,这个使用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
答案 2 :(得分:7)
# extract the numbers:
nums <- stri_extract_all_regex(list, "[0-9]+")
# Make vector and get unique numbers:
nums <- unlist(nums)
nums <- unique(nums)
这是你的第一个解决方案
对于第二种解决方案,我会使用substr
:
nums_first <- sapply(nums, function(x) unique(substr(x,1,1)))
答案 3 :(得分:6)
你可以使用?strsplit
(就像在Extracting numbers from vectors (of strings)中@ 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
答案 4 :(得分:4)
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
)
答案 5 :(得分:1)
使用strsplit使用pattern作为数字的倒数:0-9
对于您提供的示例,请执行以下操作:
tmp <- sapply(list, function (k) strsplit(k, "[^0-9]"))
然后简单地在列表中加入所有“集合”的联合,如下所示:
tmp <- Reduce(union, tmp)
然后你只需删除空字符串。
答案 6 :(得分:1)
查看str_extract_numbers()
包中的strex
功能。
pacman::p_load(strex)
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"
str_extract_numbers(charvec)
#> [[1]]
#> [1] 7 667
#>
#> [[2]]
#> [1] 7 11 5
#>
#> [[3]]
#> [1] 2 7 5
unique(unlist(str_extract_numbers(charvec)))
#> [1] 7 667 11 5 2
由reprex package(v0.2.0)创建于2018-09-03。