假设您有任意数量的向量。现在,您想要比较哪些元素在哪些向量之间共存。对于少量向量,这很容易做到"手动",例如:
a <- c("a", "b", "c")
b <- c("d", "e", "f")
c <- c("g", "h", "i")
a %in% b
a %in% c
b %in% c
然而,随着载体数量的增加,这很快变得难以处理。这些比较是否有一些漂亮且可推广的解决方案?
答案 0 :(得分:2)
首先将所有向量放在一个列表中,这样可以更轻松地使用它们。我想你只是想知道每个向量的每个元素是否出现在任何其他向量中。您可以通过将每个向量与列表中的所有其他向量进行简单的一对一比较来实现:
x <- list(a, b, c)
lapply(seq_along(x), function(n) x[[n]] %in% unlist(x[-n]))
# [[1]]
# [1] FALSE FALSE FALSE
#
# [[2]]
# [1] FALSE FALSE FALSE
#
# [[3]]
# [1] FALSE FALSE FALSE
在上述结构中,将每个向量与所有其他向量中的所有其他值进行比较(组合)。因此,第一个列表元素是一个三元素向量,指示a
或b
中的c
的每个元素是否都可以找到,等等。
如果你需要对矢量进行每次成对比较,你可以这样做:
apply(combn(seq_along(x), 2), 2, function(n) x[[n[1]]] %in% x[[n[2]]])
# [,1] [,2] [,3]
# [1,] FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE
在此结构中,每列与combn(seq_along(x), 2)
:
[,1] [,2] [,3]
[1,] 1 1 2
[2,] 2 3 3
因此,第一列表示a
中是否找到b
的每个元素,第二列表示a
中是否找到了c
的每个元素,等等。