You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效获取向量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:55:18