Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 快速获取列表中匹配项索引的方法_R_List_Optimization_Indexing_Vectorization - Fatal编程技术网

R 快速获取列表中匹配项索引的方法

R 快速获取列表中匹配项索引的方法,r,list,optimization,indexing,vectorization,R,List,Optimization,Indexing,Vectorization,给定一个包含长度不等的向量的列表a和一个包含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

给定一个包含长度不等的向量的列表
a
和一个包含
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

运行时间为0.169,可以说相当慢,但另一方面更灵活

这里有一种可能使用
匹配

> 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
要返回列表,请尝试以下操作:

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)]

a正如你帖子的评论所暗示的,这取决于当同一元素出现在
a
的多个向量中时你想做什么。假设您想要最低的索引,您可以这样做:

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

如果
b
的一个元素出现在
a
的多个元素中,您希望算法做什么?这在你的实际问题中可能吗?我应该说明。。。从15秒到0.009秒是不可能的——这是一个令人印象深刻的进步。我发现我实际上想返回一个列表而不是向量,这样它就可以处理多个匹配。我用sapply(b,函数(x)g[未在%x中列出(a)%])替换了您第一个建议中的最后一行,以实现此目的。运行时间当时为0.169,这比您的速度慢,但仍然是一个重大改进。
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)]
apply(sapply(a, function(vec) {b %in% vec}), 1, which.max)