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
相关产品推荐
相关产品推荐

