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

如何用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)

逻辑说明

  1. 外层lapply()遍历索引列表的每个染色体名称,确保只处理索引列表中存在的染色体;
  2. 内层lapply()针对每个染色体下的索引向量,直接用索引提取名称列表中对应位置的元素;
  3. 最后用setNames()保持结果列表的染色体命名与索引列表一致,保证结构匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:57:03