我有一个矢量列表,我想测试全部和全部并提取矢量交叉点:
mylist = structure(
list(c(1L, 19L, 27L, 46L, 61L, 86L, 1352L, 1408L,
654L, 1809L, 768L, 2126L, 240L, 2478L, 1026L, 386L, 2676L,
243L, 2887L, 2949L, 2992L, 659L, 3079L, 1009L, 254L, 3326L, 3391L),
integer(0),
c(18L, 27L, 1100L, 86L, 175L, 1403L,
626L, 385L, 985L, 153L, 2498L, 2617L, 2771L, 243L, 3126L, 112L,
3209L, 3236L, 3360L, 3379L, 3391L, 896L),
c(18L, 27L,
175L, 1487L, 2021L, 2033L, 369L, 893L, 243L, 889L, 3052L, 799L,
559L),
c(18L, 42L, 61L, 1187L, 1902L, 2101L, 2189L, 2191L,
2201L, 985L, 253L, 2555L, 2692L, 2748L, 243L, 956L, 3137L, 94L)
)
)
我想计算所有组合的成对矢量交叉(用intersect
),并将它们存储在我可以通过两个索引(类似矩阵)访问的东西中。
> intersect(mylist[[1]], mylist[[2]])
integer(0)
> intersect(mylist[[1]], mylist[[3]])
[1] 27 86 243 3391
> intersect(mylist[[1]], mylist[[4]])
[1] 27 243
... etc ...
我尝试了outer
,但收到以下错误:
> outer(mylist, mylist, intersect)
Error in outer(mylist, mylist, intersect) :
dims [product 25] do not match the length of object [5]
我想这是因为outer
返回一个矩阵。
除了低效的双循环方法之外还有什么方法吗?我的原始列表有~10k向量,它需要永远通过循环来完成它。
谢谢!
答案 0 :(得分:1)
这是一个非常有点猜测:
combidxs <- combn( 1:length(mylist), 2)
combidxs
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] 1 1 1 1 2 2 2 3 3 4
#[2,] 2 3 4 5 3 4 5 4 5 5
possible <- sapply( 1:10, function(n)
intersect( mylist[[ combidxs[1,n] ]],
mylist[[ combidxs[2,n] ]])
)
> str(possible)
List of 10
$ : int(0)
$ : int [1:4] 27 86 243 3391
$ : int [1:2] 27 243
$ : int [1:2] 61 243
$ : int(0)
$ : int(0)
$ : int(0)
$ : int [1:4] 18 27 175 243
$ : int [1:3] 18 985 243
$ : int [1:2] 18 243
intersect
不适用于outer
,因为它不会返回与其参数长度相同的对象。但是,您可以使用Vectorize函数返回一个可以与outer
一起使用的新函数。看看:
Vintersect <- Vectorize(intersect)
str( outer(mylist, mylist, Vintersect) )
你确实得到intersect
每个项目的结果...... outer
的对角线可以这么说......以及其他两个交叉点......