给定一个包含长度不同的向量的列表a和一个包含a中某些元素的向量b,我想要得到一个与b长度相等的向量,其中包含了b中每个元素在a中匹配的索引(这是一个糟糕的解释,我知道...)
下面的代码可以实现这个目标:
下面的代码可以实现这个目标:
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
用for循环替换sapply当然可以实现相同的功能。
问题在于,此代码将与长度超过1000的列表和向量一起使用。 在真实数据集上,该函数需要大约15秒钟(对于for循环和sapply都是如此)。
有人有想法如何加速此过程,除了并行处理的方法? 我没有看到矢量化的方法(我也不会编写C,虽然那可能是最快的方法)。
编辑:
只想强调Aaron的优雅解决方案,使用match()可以获得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,这可能略慢,但另一方面更加灵活。