比较多个向量

3
假设您有任意数量的向量。现在,您想比较哪些元素在哪些向量中共同出现。对于少量的向量,这很容易进行“手动”比较,例如:
a <- c("a", "b", "c")
b <- c("d", "e", "f")
c <- c("g", "h", "i")

a %in% b
a %in% c
b %in% c

然而,随着向量数量的增加,这很快变得难以处理。是否有一种巧妙且通用的解决方案来解决这些比较问题?

预期输出是什么? - user3710546
1个回答

3

首先,将所有矢量放入列表中,这样它们更容易处理。然后,您只需要知道每个向量的每个元素是否出现在其他向量中。您可以通过对列表中每个向量与所有其他向量进行简单的“留一法”比较来实现:

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

在上述结构中,每个向量都与所有其他向量(组合)中的所有其他值进行比较。因此,第一个列表元素是一个三元向量,指示是否在bc中找到了a的每个元素,依此类推。
如果您需要对向量进行每两两比较,可以使用以下方式:
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

因此,第一列指示是否在b中找到a的每个元素,第二列指示是否在c中找到a的每个元素,以此类推。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接