从R语言列表的各向量中提取指定索引位置的元素
嘿,这事儿在R里处理起来挺简单的,给你两种常用的方法,看看哪个更顺手:
方法1:基础R自带的
mapply()函数 这是最不用额外装包的方案,直接用基础函数就能搞定:
# 先还原你的原始数据 a <- list( c("C", "A", "C", "C", "U", "U", "G", "U", "C", "C", "U", "C", "A", "C", "G", "G", "U", "C"), c("G", "U", "A", "G", "C", "A", "C", "U", "A", "A", "A", "G", "U", "G", "C", "U", "U", "A") ) b <- list( c(3, 4, 6, 7, 9, 10, 11, 12), c(1, 2, 3, 4, 6, 7, 8, 10) ) # 核心提取代码 result <- mapply(function(x, idx) x[idx], x = a, idx = b, SIMPLIFY = FALSE) # 查看提取后的结果 result
简单解释下:mapply()会自动把a和b里的对应元素配对(比如a[[1]]配b[[1]],a[[2]]配b[[2]]),然后传给匿名函数用x[idx]提取指定位置的元素。SIMPLIFY = FALSE是为了保证结果还是列表格式,避免R自动把它转成矩阵。
方法2:用tidyverse的
purrr::map2()函数 如果你平时习惯用tidyverse工具链,map2()的写法会更直观简洁:
# 先加载purrr包(如果没装的话先跑install.packages("purrr")) library(purrr) # 核心提取代码 result <- map2(a, b, ~ .x[.y]) # 查看结果 result
这里的~ .x[.y]是公式化的写法,.x对应a里的每个向量,.y对应b里的索引向量,逻辑和第一种方法完全一致,只是代码更紧凑。
两种方法跑出来的结果是一样的:
result[[1]]会是c("C","C","U","G","C","C","U","C")result[[2]]会是c("G","U","A","G","A","C","U","A")
内容的提问来源于stack exchange,提问作者Emilio Mármol Sánchez
相关产品推荐
相关产品推荐

