返回不均匀长度矢量的列表上的外部计算?

时间:2013-12-24 00:08:00

标签: r

我有一个矢量列表,我想测试全部和全部并提取矢量交叉点:

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向量,它需要永远通过循环来完成它。

谢谢!

1 个答案:

答案 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的对角线可以这么说......以及其他两个交叉点......