(我希望这个问题已经被询问/回答。如果是,抱歉,我无法找到答案。)
假设我有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
列为all ,第二个元素的第二列等,以此类推。其他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] 删除。
我来说两句