如何比较向量列表中的两两向量是否包含共同元素?
解决向量列表两两判断是否存在共同元素的问题
问题描述
给定一个长度可变的向量列表,需要生成一个矩阵,其中每个元素表示对应位置的两个向量是否包含共同元素(自身比较返回TRUE)。例如:
xx = list(a = 1, b = c(2, 3), c = c(1, 4, 6))
预期输出矩阵:
a b c a TRUE FALSE TRUE b FALSE TRUE FALSE c TRUE FALSE TRUE
错误原因分析
你之前使用outer结合%in%的方法返回全TRUE,是因为x %in% y返回的是逻辑向量(比如c(2,3) %in% c(1,4,6)返回FALSE, FALSE),而outer在处理这种多值结果时,会将整个向量视为逻辑真(非空向量在R的逻辑判断中默认被判定为TRUE),导致所有结果都显示为TRUE。我们需要的是单个逻辑值,表示两个向量是否存在至少一个共同元素。
正确解决方案
定义一个判断两个向量是否有交集的函数,结合outer使用即可:
# 定义判断函数:检查两个向量是否存在共同元素 has_common <- function(x, y) { any(x %in% y) } # 目标向量列表 xx = list(a = 1, b = c(2, 3), c = c(1, 4, 6)) # 生成结果矩阵 result <- outer(xx, xx, has_common) print(result)
运行后输出:
a b c a TRUE FALSE TRUE b FALSE TRUE FALSE c TRUE FALSE TRUE
简化写法
也可以直接在outer中使用匿名函数,省去单独定义函数的步骤:
outer(xx, xx, function(x, y) any(x %in% y))
补充说明
any(x %in% y)会检查x中是否有至少一个元素存在于y中,返回单个TRUE/FALSE,正好符合需求。- 自身与自身比较时,
any(x %in% x)必然返回TRUE,符合预期。
内容的提问来源于stack exchange,提问作者SamPassmore
相关产品推荐
相关产品推荐

