找到矢量交叉点的所有可能组合?

时间:2014-07-15 00:29:28

标签: r

我有一组四个向量,如下所示:

[1] PRI2CO       HEISCO       PRI2CO       DIALGU       DIALGU       ALSEBL      
Levels: ALSEBL       DIALGU       HEISCO       PRI2CO  

[1] PRI2CO       TET2PA       ALSEBL       PRI2CO       ALSEBL       TET2PA      
[7] HEISCO       TET2PA      
Levels: ALSEBL       HEISCO       PRI2CO       TET2PA

我想生成一个向量,其中包含四个向量的每个可能组合之间匹配的所有值。对于上述两个,它将包含ALESBL,HEISCO和PRI2CO。到目前为止,我一直在手工做各种组合,但是它很乏味,我认为必须有更好的方法。我尝试为它编写一个循环,但我对R来说还是个新手,但它还没有工作。这就是我一直在做的事情:

trees.species.P234<-intersect(intersect(trees.species.P2,trees.species.P3),trees.species.P4)
> trees.species.P234
[1] "PRI2CO      " "ALSEBL      "

我在考虑一个涉及阶乘可能会做的for循环,但我无法让它发挥作用。

3 个答案:

答案 0 :(得分:1)

在这里,使用gadzooks提出的相同向量:

v1 <- c("PRI2CO","HEISCO","PRI2CO","DIALGU","DIALGU","ALSEBL")
v2 <- c("PRI2CO", "TET2PA","ALSEBL","PRI2CO","ALSEBL","TET2PA","HEISCO","TET2PA")
v3 <- c("PRI2CO","HEISCO","PRI2CO","DIALGU","DIALGU","ALSEBL")
v4 <- c("PRI2CO", "TET2PA","ALSEBL","PRI2CO","ALSEBL","TET2PA","HEISCO","TET2PA")

veclist <- list(v1,v2,v3,v4)
combos <- Reduce(c,lapply(2:length(veclist), 
            function(x) combn(1:length(veclist),x,simplify=FALSE) ))

lapply(combos, function(x) Reduce(intersect,veclist[x]) )

#[[1]]
#[1] "PRI2CO" "HEISCO" "ALSEBL"
# 
#[[2]]
#[1] "PRI2CO" "HEISCO" "DIALGU" "ALSEBL"
#
#[[3]]
#[1] "PRI2CO" "HEISCO" "ALSEBL"
#etc etc

答案 1 :(得分:0)

首先,您必须列出所有组合。为此使用combn函数。

> combn(1:4,2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    1    2    2    3
[2,]    2    3    4    3    4    4

现在我们可以使用apply函数来查找向量之间的交集。但在那之前 让我们创建一个向量列表。为了便于重复,我创建了这个列表。

c <- combn(1:4,2)
l <- list(c("a","b"),c("b","c"),c("c","d"),c("d","e"))
Result <- apply(c,2,function(x){intersect(l[[x[1]]],l[[x[2]]])})

如果您希望将其作为矢量使用do.call

,则此结果将是一个列表
do.call("c",Result)
[1] "b" "c" "d"

对于独特的组件

unique(do.call("c",Result))

这也适用于大型名单。

答案 2 :(得分:0)

v1 <- c("PRI2CO","HEISCO","PRI2CO","DIALGU","DIALGU","ALSEBL")
v2 <- c("PRI2CO", "TET2PA","ALSEBL","PRI2CO","ALSEBL","TET2PA","HEISCO","TET2PA")
v3 <- c("PRI2CO","HEISCO","PRI2CO","DIALGU","DIALGU","ALSEBL")
v4 <- c("PRI2CO", "TET2PA","ALSEBL","PRI2CO","ALSEBL","TET2PA","HEISCO","TET2PA")

vall <- unique(c(v1,v2,v3,v4))
for(x in vall){
   if((x %in% v1)&(x %in% v2)&(x %in% v3)&(x %in% v4)){
   print(x)}
}