2011-07-08 52 views
9

在我重新发现轮子之前:R中是否有函数接收列表x并返回列表y这样y[[i]] = intersect(x[[1]][[i]], x[[2]][[i]], ...)?如果没有,是否有一种R-adic方法可以在几行代码中进行编码?列表在R的交集

回答

9

这是行不通的吗?

x <- list(list(1:3,2:4),list(2:3,4:5),list(3:7,4:5)) 
maxlen <- max(sapply(x,length)) 
lapply(seq(maxlen),function(i) Reduce(intersect,lapply(x,"[[",i))) 

intersect只需要两个参数,所以你必须使用Reduce作为一个额外的步骤)

PS我没有任何硬的情况下尝试了这一点 - 例如长度不均匀的列表。

+0

这是相当不错的,并在R精神。 – gappy

2

看来Reduce简直可以用如下:

> Reduce(intersect, list(v1 = c("a","b","c","d"), 
+       v2 = c("a","b","e"), 
+       v3 = c("a","f","g"))) 
[1] "a"