【问题标题】:Finding all possible combinations of vector intersections?找到所有可能的向量交集组合?
【发布时间】:2014-07-18 11:20:51
【问题描述】:

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

[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 循环可能会做到这一点,但我无法让它工作。

【问题讨论】:

  • 这个:stackoverflow.com/questions/22624284/r-intersecting-strings/… 有帮助吗?这听起来像你想做什么,但我不完全确定。即 - Reduce(intersect, list(one,two) ) 适用于您的示例,可扩展到 3+ 个向量。
  • 看起来很有希望!我明天试一试,然后回来报告
  • 您也可以从library(MergeGUI)查看intersect2
  • Reduce 实际上对于找到向量的相交非常有效——在我只是将相交相互嵌套之前(即intersect(intersect(a,b),c)。我想做的是将该函数应用于所有向量的可能组合(可能像下面的combn?) - 1 和 2、1 2 3 等 - 最终可能会计算出每个唯一 ID 出现的交叉点数?我认为下面的评论是它,但我不够熟练,无法弄清楚这一点

标签: r


【解决方案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

【讨论】:

  • 成功了!非常感谢。我将 lapply 列表分配给 intesects 并添加了 table(unlist(intersects) 以获得我特别寻找的内容 - 基于 ID 存在的所有组合的唯一 ID 的计数。
【解决方案2】:

首先你必须列出所有的组合。为此使用 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))

这也可以用于大型列表。

【讨论】:

    【解决方案3】:
    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)}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多