如何高效获取向量a中与向量b匹配元素的位置并存储为列表?
高效获取向量a中与向量b元素匹配的位置列表
给定以下两个向量:
set.seed(1) a <- sample(1:100, 200, replace=T) b <- sample(1:100, 40, replace=F)
原方法sapply(b, function(x) which(a %in% x))能实现需求,但每次循环都要遍历整个a向量,数据量较大时速度很慢。以下是两种更高效的替代方案,输出结构与原方法完全一致:
方案1:基础R实现(无需额外包)
# 先按a的元素值分组,记录每个值在a中的位置 pos_map <- tapply(seq_along(a), a, identity) # 遍历b的每个元素,提取对应位置;无匹配则返回空整数向量 result <- lapply(b, function(x) { idx <- pos_map[[as.character(x)]] if (is.null(idx)) integer(0) else idx })
方案2:结合dplyr简化逻辑(可选)
如果已经加载了dplyr包,可以用其内置的%||%函数简化空值处理:
library(dplyr) match_idx <- match(a, b) pos_list <- split(seq_along(a), match_idx) result <- lapply(b, function(x) pos_list[[as.character(x)]] %||% integer(0))
效率说明
原方法的时间复杂度为O(n*m)(n是a的长度,m是b的长度),而上述方案只需遍历a一次完成分组(O(n)),之后仅需对b做线性查找(O(m)),整体复杂度降至O(n+m),数据量越大,效率提升越明显。
内容的提问来源于stack exchange,提问作者user18373817
相关产品推荐
相关产品推荐

