集合对的交集(任何可能的组合)

Intersection of pairs of sets (any possible combination)

我有不止三套,但是这里我写了下面的例子

S1<-c("Frizzy","Jack","Amy")
S2<-c("Alice","Samy","Anna","Jack")
S3<-c("Frizzy","Anna","Fred","Jack")

我想得到以下结果

length(intersect(S1,S2))+length(intersect(S1,S3))+length(intersect(S2,S3))

无需手动编写所有可能的组合。

我们可以使用combn来获取元素之间的成对intersect,获取list元素的lengths并找到sum

sum(lengths(combn(list(S1, S2, S3), 2,
      FUN = function(x) Reduce(intersect, x), simplify = FALSE)))
#[1] 5

如果有许多相同模式的对象 'S' 后跟一些数字,使用 mget 将它们全部放入 list 而不是手动写入它们

lst1 <- mget(ls(pattern = '^S\d+$'))
sum(lengths(combn(lst1, 2, 
     FUN = function(x) Reduce(intersect, x), simplify = FALSE)))
#[1] 5