30

我有一个包含随机字符的字符串列表,例如:

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)

(我在相关主题上找到了这篇文章:从字符串向量中提取数字

4

7 回答 7

57

对于第二个答案,您可以使用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.

于 2013-06-09T12:51:12.863 回答
17

这是另一个答案,这个答案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
于 2013-06-09T14:34:12.107 回答
9

使用 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)))
于 2016-10-07T09:13:07.667 回答
7

您可以使用?strsplit(就像@Arun's answer in Extracting numbers from vectors (of 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
于 2013-06-09T12:51:22.840 回答
6

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

(注意:我也调用了 list ll

于 2016-10-01T11:40:00.397 回答
1

使用 strsplit 使用模式作为数字的倒数:0-9

对于您提供的示例,请执行以下操作:

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

然后简单地取列表中所有“集合”的并集,如下所示:

tmp <- Reduce(union, tmp)

然后你只需要删除空字符串。

于 2013-06-09T12:52:06.297 回答
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 包(v0.2.0)于 2018 年 9 月 3 日创建。

于 2017-02-23T19:06:14.740 回答