在列表中得到匹配的指数快速路(Fast way of getting index of match

2019-06-25 11:00发布

给定一个列表a不等长和载体的含矢量b含有从矢量某些元素a ,我想获得相等的长度的矢量b包含在索引a在所述元素b匹配(这是一个坏的解释我知道)...

下面的代码做这项工作:

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

更换sapply用一个for循环达到同样的课程

的问题是,这个代码将被用于清单和载体带长度以上1000在一个现实生活设置的功能需要大约15秒(两者for循环和sapply )。

有没有人有一个想法如何加快这,安全的并行的方法吗? 我没有看出一个量化的方法(我不能在C程序,尽管这很可能是最快的)。

编辑:

只会强调亚伦的这些都给1667倍的数量级的速度增长(从15到0.009)优雅的采用溶液匹配()

我扩大了它一下,允许多个匹配(回报是那么的列表)

a <- list(1:3, 3:5, 3:7)
b <- c(3, 5)
g <- rep(seq_along(a), sapply(a, length))
sapply(b, function(x) g[which(unlist(a) %in% x)])
[[1]]
[1] 1 2 3

[[2]]
[1] 2 3

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

Answer 1:

下面是使用一种可能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)]


Answer 2:

至于你的信息的评论中指出,这取决于你想要什么,如果/办时,同一元素出现在多个向量a 。 假设你愿意,你可以做指数最低:

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


文章来源: Fast way of getting index of match in list