跨矢量列表的综合匹配

时间:2016-09-27 02:00:23

标签: r comparison match matching

我试图在所有可用的矢量组合之间进行匹配。

例如,我有4个向量:

a<-c(1,2,3,4)
b<-c(1,2,6,7)
c<-c(1,2,8,9)
d<-c(3,6,8,2)

预期的输出应该能告诉我:

  • &amp; amp;的相似性b:1,2
  • &amp; amp;的相似性c:1,2
  • &amp; amp;的相似性d:2,3
  • b&amp; c:1,2
  • b&amp; d:2,6
  • c&amp; d:2,8
  • &amp; amp;的相似性b&amp; c:1,2
  • b&amp; c&amp; d:2
  • &amp; amp;的相似性c&amp; d:2
  • &amp; amp;的相似性b&amp; d:2
  • &amp; amp;的相似性b&amp; c&amp; d:2

R是否具有进行此类比较/匹配的功能?

为简单起见,现在将向量数设置为4。我实际上处理100个向量,并希望在所有可能的向量组合之间进行匹配/相交/比较。例如,对于4个向量,将存在可能的4C2 + 4C3 + 4C4 = 11种可用组合。有100个矢量,可能有100C100 + 100C99 + 100C98 + ... + 100C2可用组合

提前致谢

1 个答案:

答案 0 :(得分:1)

intersect似乎做你想做的事。它一次只做一对矢量,例如

intersect(a, b) # 1 2
intersect(b, intersect(c, d)) # 2

如果您希望速记的交叉次数超过2,请尝试Reduce?Reduce

# intersection of a/b/c/d
Reduce(intersect, list(a, b, c, d), a)
# intersection of b/c/d
Reduce(intersect, list(b, c, d), b)

Reduce会先将intersect应用于列表和前一个交叉调用的结果,从intersect(b, b)开始(我刚设置为init参数之一要交叉的向量,因为集合与其自身的交集是集合。

如果你想要一种方法来浏览(a,b,c,d)的所有(对,元组,四元组)并返回交集,你可以尝试

  1. 生成长度为2(对),3(元组),4(四倍)的(a,b,c,d)的所有组合

    combos = lapply(2:4, combn, x=c('a', 'b', 'c', 'd'), simplify=F)
    # [[1]]
    # [[1]][[1]]
    # [1] "a" "b"
    # [[1]][[2]]
    # [1] "a" "c"
    # ...
    # [[2]]
    # [[2]][[1]]
    # [1] "a" "b" "c"
    # [[2]][[2]]
    # [1] "a" "b" "d"
    # ...
    # [[3]]
    # [[3]][[1]]
    # [1] "a" "b" "c" "d"
    
  2. 将其展平为一个字符向量列表

    combos = unlist(combos, recursive=F)
    # [[1]]
    # [1] "a" "b"
    # ...
    # [[10]]
    # [1] "b" "c" "d"
    # [[11]]
    # [1] "a" "b" "c" "d"
    
  3. 对于每个集合,请按照上面的说明调用Reduce。我们可以使用(例如)get("a")来获取变量a;或mget(c("a", "b", "c")在列表中获取变量abc。如果您的变量是数据框中的列,则可以进行适当的修改。

    intersects = lapply(combos, function (varnames) {
        Reduce(intersect, mget(varnames, inherits=T), get(varnames[1]))
    })
    # add some labels for clarity.
    # You will probably actually want to /do/ something with the
    #  resulting intersections rather than this.
    names(intersects) <- sapply(combos, paste, collapse=", ")
    intersects
    # $`a, b`
    # [1] 1 2
    # $`a, c`
    # [1] 1 2
    # ...
    # $`a, b, c, d`
    # [1] 2
    
  4. 您需要修改以适应您的数据在R中的情况;例如数据框的列与工作空间中的命名向量等等。 您可能也只是喜欢从步骤3开始的for循环,而不是所有*apply,具体取决于您希望的结果。 (另外,如果你有很多向量,那么在内存中同时保存所有交叉点可能不是一个好主意。)