web-dev-qa-db-ja.com

Rの文字列から一意の番号を抽出する

次のようなランダムな文字を含む文字列のリストがあります。

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

このリストにどの番号が少なくとも1回存在するか(unique())を知りたい。私の例の解決策は次のとおりです。

解決策:c(7,667,11,5,2)

11を「11」ではなく「1つ」と見なすメソッドを誰かが持っている場合、それも役立ちます。この状態の解決策は次のとおりです。

解決策:c(7,6,1,5,2)

(関連するテーマについてこの投稿を見つけました: 文字列のベクトルから数値を抽出する

29
Remi.b

2番目の答えでは、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という名前を付けました。

56
Arun

さらに別の答えがあります。これは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
16

stringi を使用したソリューション

 # extract the numbers:

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

 # Make vector and get unique numbers:

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

それがあなたの最初のソリューションです

Screenshot from on-liner in R

2番目のソリューションでは、substrを使用します。

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

?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
6
sgibb

str_match_allおよびパイプ演算子を使用したstringrソリューション。最初の解決策:

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

2番目の解決策:

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

(注:リストllとも呼んでいます)

4
Joe

strexパッケージからstr_extract_numbers()関数をチェックアウトします。

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-09-03に作成されました。

1
Rory Nolan

数値の逆数としてパターンを使用してstrsplitを使用します:0-9

指定した例の場合、これを実行します。

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

次に、次のように、リスト内のすべての「セット」の和集合を取得します。

tmp <- Reduce(union, tmp)

その後、空の文字列を削除するだけです。

1
asb