用嵌套索引列表对嵌套列表进行子集化

问题描述 投票:0回答:2

我正在尝试使用 R 基础来划分这个问题的子集。我有一个名称列表,我想将其按嵌套索引列表进行子集化。 名称列表非常紧凑和直接,索引列表是嵌套的,并且索引可能有跳跃,即某些数字可以不连续;每个子列表从 1 开始计数。

ListOfIndices
的数据是这样的:

ListOfIndices<-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))
                      )

就像这样

ListOfNames

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"))

我想要得到的是一个

ListOfIndicisedNames
:

ListOfIndicisedNames<-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"))
)

我尝试了几种口味的

lapply()
sapply()
,尽管我没能得到
do.call()
——每当我设法让它发挥作用时,我仍然发现它非常神奇。

我认为另一种方法可以通过

for
循环来获取结果,其中
i
j
分别用于列表和子列表,但每一次尝试都让 R 生气。

有人可以帮助我进入这个迷宫吗?

r list indexing nested subset
2个回答
0
投票

您可以使用

Map()
迭代索引和名称。

Map(
    \(nm, index_list)
    lapply(index_list, \(i, l) l[i], l = nm), ListOfNames, ListOfIndices
)

如果将其分配给名为

out
的变量,我们可以检查它是否会产生所需的结果:

identical(ListOfIndicisedNames, out)
# [1] TRUE

0
投票

由于名称列表和索引列表的长度相同,因此可以使用

mapply
均匀地迭代它们,然后可以使用
lapply

迭代每个子列表
mapply(function(indexes,names) {
  lapply(indexes,function(indexes,names) { names[indexes] },names=names)  
},indexes=ListOfIndices,ListOfNames)

另外,该示例表明您要为列表分配名称?尝试使用“=”而不是“<-" within the list definition:

ListOfIndices<-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))
                      )
© www.soinside.com 2019 - 2024. All rights reserved.