次のようなランダムな文字を含む文字列のリストがあります。
_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)
(関連するテーマについてこの投稿を見つけました: 文字列のベクトルから数値を抽出する )
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
という名前を付けました。
さらに別の答えがあります。これは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
# extract the numbers:
nums <- stri_extract_all_regex(list, "[0-9]+")
# Make vector and get unique numbers:
nums <- unlist(nums)
nums <- unique(nums)
それがあなたの最初のソリューションです
2番目のソリューションでは、substr
を使用します。
nums_first <- sapply(nums, function(x) unique(substr(x,1,1)))
?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
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
とも呼んでいます)
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に作成されました。
数値の逆数としてパターンを使用してstrsplitを使用します:0-9
指定した例の場合、これを実行します。
tmp <- sapply(list, function (k) strsplit(k, "[^0-9]"))
次に、次のように、リスト内のすべての「セット」の和集合を取得します。
tmp <- Reduce(union, tmp)
その後、空の文字列を削除するだけです。