在列表中获取匹配索引的快捷方法

时间:2012-06-12 18:15:00

标签: r list optimization indexing vectorization

给定一个包含不等长度向量的列表a和包含b中向量的一些元素的向量a,我希望得到一个长度等于{{1}的向量包含ba中元素匹配的索引(这是我所知道的错误解释)......

以下代码完成了这项工作:

b

用for循环替换a <- list(1:3, 4:5, 6:9) b <- c(2, 3, 5, 8) sapply(b, function(x, list) which(unlist(lapply(list, function(y, z) z %in% y, z=x))), list=a) [1] 1 1 2 3 实现了相同的目标

问题是此代码将与长度大于1000的列表和向量一起使用。在现实生活中,该函数大约需要15秒(for循环和sapply)。

有没有人知道如何提高速度,对并行方法安全?我没有看到矢量化的方法(我不能用C语言编程,尽管这可能是最快的。)

修改

将使用match()强调Aaron的优雅解决方案,其速度提升1667次(从15到0.009)

我在它上面扩展了一下以允许多个匹配(返回是一个列表)

sapply

这个的运行时间是0.169,这可能相当慢,但另一方面更灵活

2 个答案:

答案 0 :(得分:15)

以下是使用match

的一种可能性
> a <- list(1:3, 4:5, 6:9)
> b <- c(2, 3, 5, 8)
> g <- rep(seq_along(a), sapply(a, length))
> g[match(b, unlist(a))]
[1] 1 1 2 3

findInterval是另一种选择:

> findInterval(match(b, unlist(a)), cumsum(c(0,sapply(a, length)))+1)
[1] 1 1 2 3

要返回列表,请尝试以下操作:

a <- list(1:3, 4:5, 5:9)
b <- c(2,3,5,8,5)
g <- rep(seq_along(a), sapply(a, length))
aa <- unlist(a)
au <- unique(aa)
af <- factor(aa, levels=au)
gg <- split(g, af)
gg[match(b, au)]

答案 1 :(得分:0)

正如您对帖子的评论所暗示的,这取决于您在a中的多个向量中出现相同元素时要执行的操作。假设你想要最低的索引:

apply(sapply(a, function(vec) {b %in% vec}), 1, which.max)