如何将R语言向量映射为对应列表的层级标签?
向量到列表层级标签的映射实现方法
基础R高效解法
先构建值与层级标签的映射关系,再通过匹配快速得到结果,适合数据量较大的场景:
# 定义原始数据 v1 <- c(8, 18, 19, 22, 23, 26, 36, 51, 52, 69, 72, 78, 89, 94, 105) L1 <- list(c(8, 18, 19), c(22, 23, 26, 36), c(51, 52), c(69, 72, 78), c(89, 94), c(105)) v2 <- c(22,22,26,105) # 构建映射表:将列表元素展开,对应到所属层级 map_values <- unlist(L1) level_tags <- rep(seq_along(L1), sapply(L1, length)) # 匹配得到结果 result_v1 <- level_tags[match(v1, map_values)] result_v2 <- level_tags[match(v2, map_values)] # 查看输出 result_v1 # [1] 1 1 1 2 2 2 2 3 3 4 4 4 5 5 6 result_v2 # [1] 2 2 2 6
tidyverse直观解法
如果使用purrr包,可直接遍历向量元素,查找其所属的列表索引,代码更直观:
library(purrr) result_v1 <- map_int(v1, ~ which(sapply(L1, function(x) .x %in% x))) result_v2 <- map_int(v2, ~ which(sapply(L1, function(x) .x %in% x)))
注意事项
- 如果向量中存在不在L1任何子列表中的元素,
match会返回NA,可通过replace(result_v1, is.na(result_v1), 0)(或其他自定义标记值)处理缺失情况; - 基础R方法效率更高,因为仅需一次匹配操作;
purrr方法会遍历每个元素逐一判断,数据量大时性能差异明显。
内容的提问来源于stack exchange,提问作者Tou Mou
相关产品推荐
相关产品推荐

