我试图在所有可用的矢量组合之间进行匹配。
例如,我有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)
预期的输出应该能告诉我:
R是否具有进行此类比较/匹配的功能?
为简单起见,现在将向量数设置为4。我实际上处理100个向量,并希望在所有可能的向量组合之间进行匹配/相交/比较。例如,对于4个向量,将存在可能的4C2 + 4C3 + 4C4 = 11种可用组合。有100个矢量,可能有100C100 + 100C99 + 100C98 + ... + 100C2可用组合
提前致谢
答案 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)的所有(对,元组,四元组)并返回交集,你可以尝试
生成长度为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"
将其展平为一个字符向量列表
combos = unlist(combos, recursive=F)
# [[1]]
# [1] "a" "b"
# ...
# [[10]]
# [1] "b" "c" "d"
# [[11]]
# [1] "a" "b" "c" "d"
对于每个集合,请按照上面的说明调用Reduce
。我们可以使用(例如)get("a")
来获取变量a
;或mget(c("a", "b", "c")
在列表中获取变量a
,b
,c
。如果您的变量是数据框中的列,则可以进行适当的修改。
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
您需要修改以适应您的数据在R中的情况;例如数据框的列与工作空间中的命名向量等等。
您可能也只是喜欢从步骤3开始的for
循环,而不是所有*apply
,具体取决于您希望做的结果。 (另外,如果你有很多向量,那么在内存中同时保存所有交叉点可能不是一个好主意。)