(これはすでに質問/回答されていると思います。そうであれば、申し訳ありませんが、回答を見つけることができません。)
6つのベクトルがあるとしましょう。各ベクトルの要素が他のすべてのベクトルの要素と等しいかどうかをすばやく確認するにはどうすればよいですか?
私は次のことができることを知っています、そしてそれは本当に面倒/先史時代/エラーが発生しやすいと感じます:
any(vec1 %in% vec2, vec1 %in% vec3, vec1 %in% vec4, vec1 %in% vec5, vec1 %in% vec6,
vec2 %in% vec3, vec2 %in% vec4, vec2 %in% vec5, vec2 %in% vec6,
vec3 %in% vec4, vec3 %in% vec5, vec3 %in% vec6,
vec4 %in% vec5, vec4 %in% vec6,
vec5 %in% vec6)
ありがとう。
ちなみに、複数のベクトルから共通の要素を見つける方法を確認しました。そしてそれは、ベクトルのいずれかからの要素が等しいかどうかではなく、各ベクトルに存在する要素を識別する方法を求めているように見えます。
ベクトルをリストに入れると、次の操作が大幅に簡単になります。
# make sample data
set.seed(47)
x <- replicate(6, rpois(3, 10), simplify = FALSE)
str(x)
# List of 6
# $ : int [1:3] 16 12 10
# $ : int [1:3] 9 10 6
# $ : int [1:3] 10 14 4
# $ : int [1:3] 7 6 4
# $ : int [1:3] 12 8 7
# $ : int [1:3] 7 11 8
今度はlapply
:で繰り返します
lapply(x, function(y){sapply(x, function(z){y %in% z})})
## [[1]]
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] TRUE FALSE FALSE FALSE FALSE FALSE
## [2,] TRUE FALSE FALSE FALSE TRUE FALSE
## [3,] TRUE TRUE TRUE FALSE FALSE FALSE
##
## [[2]]
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] FALSE TRUE FALSE FALSE FALSE FALSE
## [2,] TRUE TRUE TRUE FALSE FALSE FALSE
## [3,] FALSE TRUE FALSE TRUE FALSE FALSE
## ... ... ... ... ... ... ...
これは各ベクトルの行列です。ここで、行はそれぞれのベクトルの要素であり、列はリスト内の各ベクトルであり、値はその要素がそのベクトルにあるかどうかを示します。明らかに、それぞれがそれ自体と一致するため、最初の要素の最初の列はすべてTRUE
であり、2番目の要素の2番目の列も同様です。他TRUE
のsは、ベクトル間の一致を示します。長さが一貫していない場合、行列ではなく同じ情報のネストされたリストが返されます。とにかくネストされたリストが必要な場合は、に変更sapply
してくださいlapply
。
または、各ベクトルに一致するベクトルが必要な場合は、
str(lapply(x, function(y){which(sapply(x, function(z){any(y %in% z)}))}))
## List of 6
## $ : int [1:4] 1 2 3 5
## $ : int [1:4] 1 2 3 4
## $ : int [1:4] 1 2 3 4
## $ : int [1:5] 2 3 4 5 6
## $ : int [1:4] 1 4 5 6
## $ : int [1:3] 4 5 6
ここで、各要素にはまだ一致としてそれ自体が含まれています。which
インデックスの代わりにブール値を取り出します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加