如何用R基础包通过嵌套索引列表子集化嵌套名称列表?
R基础包嵌套列表子集化解决方案
问题描述
需要使用R基础包,根据多个嵌套索引列表(如ListOfIndices_1、ListOfIndices_2)对嵌套名称列表ListOfNames进行子集化。索引列表为嵌套结构,索引从1开始计数,可能非连续,且所有索引值均小于对应名称向量的长度,确保可安全用于子集化。
示例数据
索引列表示例
ListOfIndices_1 <- list( Chr1 = list(c(1,2,3,4,5,6), c(7,8,9,10), c(11,12)), Chr2 = list(c(4,5), c(7,8,9,10)), Chr3 = list(c(1,2,3), c(5,6,7,8,9), c(10,11), c(14,15,16)) ) ListOfIndices_2 <- list( Chr1 = list(c(1,2),c(5,6,7),c(10,11,12)), Chr2 = list(c(1,2,3), c(4,5), c(9,10), c(13,14,15,16)), Chr3 = list(c(1,2), c(5,6,7), c(10,11), c(15,16)), Chr4 = list(c(2,3,4), c(5,6), c(8,9,10,11), c(13,14,15,16)) )
名称列表示例
ListOfNames <- list( Chr1 = c("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A1","B2","C3","D4","E1","F2","G3","H4","I1"), Chr2 = c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","a1","b2","c3","d4","e5","f6","g7","h8","i9","j10","k11","l12","m13","n14","o15","p16","q17","r18","s19","t20","u1","v2","w3","x4","y5","z6"), Chr3 = c("aA","bB","cC","dD","eE","fF","gG","hH","iI","jJ","kK","lL","mM","nN","oO","pP","qQ","rR","sS","tT","uU","vV","wW","xX","yY","zZ"), Chr4 = c("aA1","bB2","cC3","dD4","eE5","fF6","gG7","hH8","iI9","jJ10","kK11","lL12","mM13","nN14","oO15","pP16","qQ17","rR18","sS19","tT20","uU21","vV22","wW23","xX24","yY25","zZ26") )
期望输出
ListOfIndicisedNames_1 <- list( Chr1 = list(c("A","B","C","D","E","F"),c("G","H","I","J"),c("K","L")), Chr2 = list(c("d","e"), c("g","h","i","j")), Chr3 = list(c("aA","bB","cC"), c("eE","fF","gG","hH","iI"), c("jJ","kK"),c("nN","oO","pP")) ) ListOfIndicisedNames_2 <- list( Chr1 = list(c("A","B"), c("E","F","G"), c("J","K","L")), Chr2 = list(c("a","b","c"), c("d","e"), c("i","j"), c("m","n","o","p")), Chr3 = list(c("aA","bB"), c("eE","fF","gG"), c("jJ","kK"), c("oO","pP")), Chr4 = list(c("bB2","cC3","dD4"), c("eE5","fF6"), c("hH8","iI9","jJ10","kK11"), c("mM13","nN14","oO15","pP16")) )
解决方案
使用嵌套lapply()实现层级化子集化,同时保留原列表的结构和命名:
定义子集化函数
subset_names <- function(names_list, indices_list) { # 遍历索引列表的每个染色体名称 lapply(names(indices_list), function(chr) { # 遍历当前染色体下的所有索引向量,提取对应名称 lapply(indices_list[[chr]], function(idx) { names_list[[chr]][idx] }) }) |> # 为结果列表设置与索引列表一致的染色体名称 setNames(names(indices_list)) }
调用函数生成结果
ListOfIndicisedNames_1 <- subset_names(ListOfNames, ListOfIndices_1) ListOfIndicisedNames_2 <- subset_names(ListOfNames, ListOfIndices_2)
逻辑说明
- 外层
lapply()遍历索引列表的每个染色体名称,确保只处理索引列表中存在的染色体; - 内层
lapply()针对每个染色体下的索引向量,直接用索引提取名称列表中对应位置的元素; - 最后用
setNames()保持结果列表的染色体命名与索引列表一致,保证结构匹配。
内容的提问来源于stack exchange,提问作者Alkaligrass
相关产品推荐
相关产品推荐

