多个向量之间共享元素的交叉制表

Cross-tabulation of shared elements between several vectors

我正在尝试在 R 中同时获取多个向量之间的交集中的元素数量,但失败了:我有几个不同长度的字符向量(唯一元素),并且想要获取它们之间共享的元素数量每对向量。

本质上,这意味着类似于 length(intersect(a,b)),但重复了几个 times/as 对所有向量组合的交叉制表。

我觉得这是一个涉及 apply() 家族之类的简单案例,但我似乎无法弄清楚...:-/

感谢您的宝贵意见!

可以使用Reduce;这是一个最小的可重现示例

a1 <- 1:5
a2 <- 3:6
a3 <- 4:9

Reduce(intersect, list(a1, a2, a3))
#[1] 4 5

关键是将向量存储在 list.

要获得所有向量组合的交集,您可以执行以下操作:

l <- list(a1 = 1:5, a2 = 3:6, a3 = 4:9)

intsct_list <- combn(seq_along(l), 2, function(x) intersect(l[[x[1]]], l[[x[2]]]), simplify = FALSE)

names(intsct_list) <- combn(names(l), 2, paste0, collapse = "")

lengths(intsct_list)  

a1a2 a1a3 a2a3 
   3    2    3