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

R语言中生成向量值到索引的映射表求助

在R中实现向量值到索引位置的映射表

嘿,这个需求其实很容易实现,我给你分享几个实用的方法,不管是用基础R还是tidyverse工具都能搞定,还能自动忽略掉向量里的NA值~

先明确你的需求

你给出的向量是:

a = c(1, 3, 2, 2, 4, 1, 1, NA)

需要生成值到对应索引的映射(注意你示例里的[["5"]] 5应该是笔误,原向量里第5位是4,所以正确的映射应该是[["4"]] 5哦)。


方法一:基础R的split()函数(最直接)

这是最简洁的基础方法,思路是先过滤掉NA对应的索引,再按向量值分组:

# 定义你的向量
a = c(1, 3, 2, 2, 4, 1, 1, NA)

# 获取所有非NA值的索引位置
non_na_idx <- which(!is.na(a))

# 按向量值(转成字符格式)分组索引,生成映射表
result <- split(non_na_idx, as.character(a[non_na_idx]))

运行后输出的result就是你要的格式:

> result
$`1`
[1] 1 6 7

$`2`
[1] 3 4

$`3`
[1] 2

$`4`
[1] 5

方法二:基础R的tapply()函数

tapply()也能实现同样的效果,它会自动处理NA分组(直接忽略):

a = c(1, 3, 2, 2, 4, 1, 1, NA)

result <- tapply(seq_along(a), a, function(x) x[!is.na(x)])

这个方法的结果和上面完全一致,代码更短一点~


方法三:tidyverse风格实现(适合熟悉dplyr的用户)

如果你习惯用tidyverse工具链,也可以用数据框的方式来处理:

library(dplyr)
library(tibble)
library(purrr)

a = c(1, 3, 2, 2, 4, 1, 1, NA)

result <- tibble(value = a, index = seq_along(a)) %>%
  filter(!is.na(value)) %>%  # 过滤NA值
  group_split(value, .keep = FALSE) %>%  # 按值分组
  set_names(map(., ~as.character(.$index[1])) %>% unlist()) %>%  # 设置组名为对应的值
  map(~.$index)  # 提取每个组的索引

运行后同样会得到目标映射表。


内容的提问来源于stack exchange,提问作者Hanbo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:03:26